Nah, apa yang biasanya saya lakukan adalah memiliki metode saya yang bisa error-out saat runtime mengambil referensi ke sebuah NSError
pointer. Jika ada sesuatu yang salah dalam metode itu, saya dapat mengisi NSError
referensi dengan data kesalahan dan mengembalikan nol dari metode tersebut.
Contoh:
- (id) endWorldHunger:(id)largeAmountsOfMonies error:(NSError**)error {
// begin feeding the world's children...
// it's all going well until....
if (ohNoImOutOfMonies) {
// sad, we can't solve world hunger, but we can let people know what went wrong!
// init dictionary to be used to populate error object
NSMutableDictionary* details = [NSMutableDictionary dictionary];
[details setValue:@"ran out of money" forKey:NSLocalizedDescriptionKey];
// populate the error object with the details
*error = [NSError errorWithDomain:@"world" code:200 userInfo:details];
// we couldn't feed the world's children...return nil..sniffle...sniffle
return nil;
}
// wohoo! We fed the world's children. The world is now in lots of debt. But who cares?
return YES;
}
Kami kemudian dapat menggunakan metode seperti ini. Bahkan tidak perlu repot untuk memeriksa objek kesalahan kecuali metode mengembalikan nol:
// initialize NSError object
NSError* error = nil;
// try to feed the world
id yayOrNay = [self endWorldHunger:smallAmountsOfMonies error:&error];
if (!yayOrNay) {
// inspect error
NSLog(@"%@", [error localizedDescription]);
}
// otherwise the world has been fed. Wow, your code must rock.
Kami dapat mengakses kesalahan localizedDescription
karena kami menetapkan nilai untuk NSLocalizedDescriptionKey
.
Tempat terbaik untuk informasi lebih lanjut adalah dokumentasi Apple . Sangat bagus.
Ada juga tutorial yang bagus dan sederhana tentang Cocoa Is My Girlfriend .
id
ke aBOOL
. Variasi yang kompatibel dengan ARC sedikit akan sangat dihargai.BOOL
. KembaliNO
jika terjadi kesalahan dan bukannya memeriksa nilai kembali, cukup periksaerror
. Jikanil
terus maju, jika!= nil
menanganinya.**error
bukan nol. Kalau tidak, program akan melempar kesalahan yang sama sekali tidak ramah dan tidak membuat jelas apa yang terjadi.Saya ingin menambahkan beberapa saran lagi berdasarkan implementasi terbaru saya. Saya telah melihat beberapa kode dari Apple dan saya pikir kode saya berperilaku dengan cara yang sama.
Posting di atas sudah menjelaskan cara membuat objek NSError dan mengembalikannya, jadi saya tidak akan repot dengan bagian itu. Saya hanya akan mencoba menyarankan cara yang baik untuk mengintegrasikan kesalahan (kode, pesan) di aplikasi Anda sendiri.
Saya sarankan untuk membuat 1 tajuk yang akan menjadi ikhtisar semua kesalahan domain Anda (mis. Aplikasi, pustaka, dll.). Header saya saat ini terlihat seperti ini:
FSError.h
FSError.m
Sekarang ketika menggunakan nilai-nilai di atas untuk kesalahan, Apple akan membuat beberapa pesan kesalahan standar dasar untuk aplikasi Anda. Kesalahan dapat dibuat seperti berikut:
Pesan kesalahan standar yang dihasilkan Apple (
error.localizedDescription
) untuk kode di atas akan terlihat seperti berikut:Error Domain=com.felis.myapp Code=1002 "The operation couldn’t be completed. (com.felis.myapp error 1002.)"
Di atas sudah cukup membantu bagi pengembang, karena pesan menampilkan domain tempat kesalahan terjadi dan kode kesalahan yang sesuai. Pengguna akhir tidak akan tahu kode kesalahan apa
1002
artinya , jadi sekarang kita perlu mengimplementasikan beberapa pesan bagus untuk setiap kode.Untuk pesan kesalahan kami harus mengingat lokalisasi (bahkan jika kami tidak segera mengimplementasikan pesan lokal). Saya telah menggunakan pendekatan berikut dalam proyek saya saat ini:
1) buat
strings
file yang akan mengandung kesalahan. File string mudah dilokalisasi. File tersebut dapat terlihat seperti berikut:FSError.strings
2) Tambahkan makro untuk mengonversi kode integer ke pesan kesalahan yang dilokalkan. Saya telah menggunakan 2 makro dalam file Constants + Macros.h saya. Saya selalu menyertakan file ini di header awalan (
MyApp-Prefix.pch
) untuk kenyamanan.Konstanta + Makro.h
3) Sekarang mudah untuk menampilkan pesan kesalahan yang ramah pengguna berdasarkan kode kesalahan. Sebuah contoh:
sumber
Constants+Macros.h
dan mengimpor file ini di header awalan (.pch
file) sehingga tersedia di mana-mana. Jika Anda maksudnya Anda hanya menggunakan 1 dari 2 makro, itu mungkin berhasil. Mungkin konversi dariint
keNSString
tidak terlalu penting, meskipun saya belum menguji ini..strings
file), karena di situlah makro Apple akan terlihat. Baca tentang menggunakan diNSLocalizedStringFromTable
sini: developer.apple.com/library/mac/documentation/cocoa/conceptual/…FS_ERROR_LOCALIZED_DESCRIPTION
memeriksa string localisable dalam file bernamaFSError.strings
. Anda mungkin ingin melihat panduan pelokalan Apple pada.strings
file jika ini asing bagi Anda.Jawaban bagus Alex. Salah satu masalah yang potensial adalah dereference NULL. Referensi Apple tentang Membuat dan Mengembalikan objek NSError
sumber
Objektif-C
Cepat 3
sumber
Silakan lihat tutorial berikut
Saya harap ini akan membantu Anda tetapi sebelum Anda harus membaca dokumentasi NSError
Tautan ini sangat menarik yang saya temukan baru-baru ini ErrorHandling
sumber
Saya akan mencoba merangkum jawaban hebat dari Alex dan poin jlmendezbonini, menambahkan modifikasi yang akan membuat semuanya ARC kompatibel (sejauh ini bukan karena ARC akan mengeluh karena Anda harus kembali
id
, yang berarti "objek apa pun", tetapiBOOL
bukan objek Tipe).Sekarang alih-alih memeriksa nilai balik dari pemanggilan metode kami, kami memeriksa apakah
error
masihnil
. Jika tidak, kita punya masalah.sumber
Pola desain lain yang saya lihat melibatkan menggunakan blok, yang sangat berguna ketika suatu metode dijalankan secara tidak sinkron.
Katakanlah kita memiliki kode kesalahan berikut yang ditetapkan:
Anda akan mendefinisikan metode Anda yang dapat meningkatkan kesalahan seperti:
Dan kemudian ketika Anda menyebutnya, Anda tidak perlu khawatir tentang mendeklarasikan objek NSError (penyelesaian kode akan melakukannya untuk Anda), atau memeriksa nilai yang dikembalikan. Anda bisa menyediakan dua blok: satu yang akan dipanggil ketika ada pengecualian, dan satu yang dipanggil saat berhasil:
sumber
Yah itu sedikit keluar dari ruang lingkup pertanyaan tetapi jika Anda tidak memiliki opsi untuk NSError Anda selalu dapat menampilkan kesalahan tingkat rendah:
sumber
yang dapat saya gunakan
NSError.defaultError()
setiap kali saya tidak memiliki objek kesalahan yang valid.sumber