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
FOUNDATION_EXPORT NSString *const FSMyAppErrorDomain;
enum {
FSUserNotLoggedInError = 1000,
FSUserLogoutFailedError,
FSProfileParsingFailedError,
FSProfileBadLoginError,
FSFNIDParsingFailedError,
};
FSError.m
#import "FSError.h"
NSString *const FSMyAppErrorDomain = @"com.felis.myapp";
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:
+ (FSProfileInfo *)profileInfoWithData:(NSData *)data error:(NSError **)error
{
FSProfileInfo *profileInfo = [[FSProfileInfo alloc] init];
if (profileInfo)
{
/* ... lots of parsing code here ... */
if (profileInfo.username == nil)
{
*error = [NSError errorWithDomain:FSMyAppErrorDomain code:FSProfileParsingFailedError userInfo:nil];
return nil;
}
}
return profileInfo;
}
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 apa1002
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
"1000" = "User not logged in.";
"1001" = "Logout failed.";
"1002" = "Parser failed.";
"1003" = "Incorrect username or password.";
"1004" = "Failed to parse FNID."
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
// error handling ...
#define FS_ERROR_KEY(code) [NSString stringWithFormat:@"%d", code]
#define FS_ERROR_LOCALIZED_DESCRIPTION(code) NSLocalizedStringFromTable(FS_ERROR_KEY(code), @"FSError", nil)
3) Sekarang mudah untuk menampilkan pesan kesalahan yang ramah pengguna berdasarkan kode kesalahan. Sebuah contoh:
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
message:FS_ERROR_LOCALIZED_DESCRIPTION(error.code)
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];