Saya ingin melakukan sesuatu di Swift 2 yang biasa saya lakukan dalam beberapa bahasa lain: melempar pengecualian runtime dengan pesan khusus. Misalnya (di Jawa):
throw new RuntimeException("A custom message here")
Saya mengerti bahwa saya dapat membuang tipe enum yang sesuai dengan protokol ErrorType, tetapi saya tidak ingin harus mendefinisikan enum untuk setiap jenis kesalahan yang saya lemparkan. Idealnya, saya ingin meniru contoh di atas sedekat mungkin. Saya melihat ke dalam membuat kelas kustom yang mengimplementasikan protokol ErrorType, tapi saya bahkan tidak tahu apa yang dibutuhkan oleh protokol itu (lihat dokumentasi ). Ide ide?
Jawaban:
Pendekatan yang paling sederhana mungkin untuk mendefinisikan satu kebiasaan
enum
dengan hanya satucase
yang telahString
melekat padanya:Atau, pada Swift 4:
Contoh penggunaannya akan seperti:
Jika Anda ingin menggunakan
Error
jenis yang sudah ada , yang paling umum adalahNSError
, dan Anda bisa membuat metode pabrik untuk membuat dan melempar dengan pesan khusus.sumber
String
dalam AndaerrorMessage
, jika demikian, bagaimana saya melakukannya?String
sini dikaitkan denganMyError.RuntimeError
(diatur pada saatthrow
), dan Anda mendapatkan akses ke itu padacatch
(denganlet errorMessage
).try!
, yang tidak digunakan di sini. Anda bahkan tidak dapat melakukan panggilan yang berpotensi tanpa jenistry
. (Juga bagian dari kode itu adalah contoh penggunaan, bukan solusi yang sebenarnya.)Cara paling sederhana adalah dengan
String
menyesuaikan diri denganError
:Maka Anda bisa melempar string:
Untuk menjadikan string itu sendiri sebagai
localizedString
galat, Anda dapat memperluasLocalizedError
:sumber
localizedDescription
menjadi senar itu sendiri?Redundant conformance of 'String' to protocol 'Error'
:(error.localizedDescription
setelah melempar string.@ nick-keets's solusi yang paling elegan, tapi itu gagal bagi saya dalam target pengujian dengan kesalahan waktu kompilasi berikut:
Redundant conformance of 'String' to protocol 'Error'
Inilah pendekatan lain:
Dan untuk menggunakan:
sumber
Lihat versi keren ini. Idenya adalah untuk mengimplementasikan protokol String dan ErrorType dan menggunakan rawValue kesalahan.
Pemakaian:
sumber
as User.UserValidationError
dan di atas itu.rawValue
. Namun, jika Anda malah diimplementasikanCustomStringConvertible
sebagaivar description: String { return rawValue }
, hal ini mungkin berguna untuk mendapatkan deskripsi kustom menggunakan sintaks enum tanpa harus melaluirawValue
di setiap tempat di mana Anda mencetaknya.Swift 4:
Sesuai:
https://developer.apple.com/documentation/foundation/nserror
jika Anda tidak ingin mendefinisikan pengecualian khusus, Anda bisa menggunakan objek NSError standar sebagai berikut:
Cetakan:
Ini memungkinkan Anda untuk menyediakan string khusus, ditambah kode numerik dan kamus dengan semua data tambahan yang Anda butuhkan, apa pun jenisnya.
NB: ini diuji pada OS = Linux (Ubuntu 16.04 LTS).
sumber
Solusi paling sederhana tanpa ekstensi tambahan, enum, kelas, dan lain-lain .:
sumber
raise()
bukanthrow
) yang sulit diingat. Bandingkan solusi Anda denganthrow Foo.Bar("baz")
atauthrow "foo"
dikalikan dengan jumlah tempat di mana pengecualian dilemparkan - IMO biaya satu kali perpanjangan satu baris atau enum jauh lebih disukai daripada hal-hal sepertiNSExceptionName
.postNotification
memerlukan 2-3 params dan pemilihnya mirip dengan yang ini. Apakah Anda mengesampingkanNotification
dan / atauNotificationCenter
dalam setiap proyek untuk mengizinkannya menerima lebih sedikit input params?String
untuk menyesuaikan diriError
terlalu mengejutkan, atau jikaMyError
enum terlalu kabur (secara pribadi saya akan menjawab ya untuk keduanya, dan sebaliknya melakukan enum case terpisah untuk setiap kesalahan, yaitu,throw ThisTypeOfError.thisParticularCase
).Berdasarkan jawaban @Nick keets, berikut adalah contoh yang lebih lengkap:
Awalnya diterbitkan di blog cepat saya: http://eon.codes/blog/2017/09/01/throwing-simple-errors/
sumber
throw NSError(message: "err", code: 0)
domain
, bukanmessage
, kan?Jika Anda tidak perlu menangkap kesalahan dan Anda ingin segera menghentikan aplikasi, Anda dapat menggunakan fatalError:
fatalError ("Custom message here")
sumber
Saya suka jawaban @ Alexander-Borisenko, tetapi deskripsi yang dilokalkan tidak dikembalikan ketika ditangkap sebagai Kesalahan. Tampaknya Anda perlu menggunakan LocalizedError sebagai gantinya:
Lihat jawaban ini untuk lebih jelasnya.
sumber