//
// ViewController.m
// 第14章 專家級技巧:錯誤處理
//
// Created by meipaipai on 17/2/3.
// Copyright © 2017年 meipaipai. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()<NSURLConnectionDelegate>
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//14-1.執行時錯誤情況
//-- 程式執行時出現的錯誤情況
//-- 邏輯錯誤,語義錯誤,使用者輸入錯誤
/*
* 1.斷言:判斷條件是否成立,檢查程式設計邏輯和語義錯誤
* 2.錯誤編碼:標示制定執行時錯誤
* 3.錯誤物件:用於封裝和傳輸使用者需要了解的執行時錯誤資訊
* 4.異常:程式執行過程中出現的反常
*/
//14-2 NSError類
//-- 建立錯誤物件, 屬性是錯誤編碼,錯誤域和使用者資訊目錄。
// NSError *error = [NSError errorWithDomain:NSCocoaErrorDomain code:NSFileNoSuchFileError userInfo:nil];
//如果在指定目錄沒有找到檔案,這個錯誤物件就會被建立
NSString *desc = NSLocalizedString(@"FileNotFound", @"");
NSDictionary *info = @{NSLocalizedDescriptionKey:desc};
NSError *err = [NSError errorWithDomain:NSCocoaErrorDomain code:NSFileNoSuchFileError userInfo:info];
NSLog(@"%@", err);
/*errorWithDomain:錯誤域
FOUNDATION_EXPORT NSErrorDomain const NSCocoaErrorDomain;//Cocoa Frameworks的錯誤編碼
FOUNDATION_EXPORT NSErrorDomain const NSPOSIXErrorDomain;//源自遵守POSIX標準的Unix版本的錯誤編碼
FOUNDATION_EXPORT NSErrorDomain const NSOSStatusErrorDomain;//Apple OS X Core Services 和 Carbon framework的錯誤編碼
FOUNDATION_EXPORT NSErrorDomain const NSMachErrorDomain;//OS核心錯誤編碼
*/
//1.使用錯誤物件
//-- 委託:將錯誤物件作為引數傳送給委託方法
//-- 間接:從程式呼叫的方法間接獲取錯誤物件
// NSError *writeerr;
// NSData *greeting = [@"Hello, world" dataUsingEncoding:NSUTF8StringEncoding];
// BOOL success = [FileWriter write......]
//14-3 異常處理,執行過程中處理異常的機制
@try {
// Code that can potentially throw an exception
//可能丟擲異常的程式碼
} @catch (NSException *exception) {
// Handle an exception thrown in the @try block
//處理異常的程式碼
@throw exception;
// @throw expression 丟擲異常
} @finally {
// Code that gets executed whether or not an exception is thrown
//釋放資源的程式碼
}
//14-4 NSException 類
//-- 管理異常
//exceptionWithName 異常名稱
//reason 異常原因
//userInfo 自定義資訊目錄
// NSException *exception = [NSException exceptionWithName:NSGenericException reason:@"111" userInfo:nil];
// @try {
// [NSException raise:NSGenericException format:@"%@", @"22222"];
// } @catch (NSException *exception) {
// NSLog(@"%@--\n%@", [exception name], [exception description]);
// }
NSArray *array = @[@"1", @"2", @"3", @"4"];
@try {
int a = 4;
NSLog(@"%@", array[a]);
} @catch (NSException *exception) {
NSLog(@"%@--\n%@", [exception name], [exception description]);
}
/*
FOUNDATION_EXPORT NSExceptionName const NSGenericException;
FOUNDATION_EXPORT NSExceptionName const NSRangeException;
FOUNDATION_EXPORT NSExceptionName const NSInvalidArgumentException;
FOUNDATION_EXPORT NSExceptionName const NSInternalInconsistencyException;
FOUNDATION_EXPORT NSExceptionName const NSMallocException;
FOUNDATION_EXPORT NSExceptionName const NSObjectInaccessibleException;
FOUNDATION_EXPORT NSExceptionName const NSObjectNotAvailableException;
FOUNDATION_EXPORT NSExceptionName const NSDestinationInvalidException;
FOUNDATION_EXPORT NSExceptionName const NSPortTimeoutException;
FOUNDATION_EXPORT NSExceptionName const NSInvalidSendPortException;
FOUNDATION_EXPORT NSExceptionName const NSInvalidReceivePortException;
FOUNDATION_EXPORT NSExceptionName const NSPortSendException;
FOUNDATION_EXPORT NSExceptionName const NSPortReceiveException;
FOUNDATION_EXPORT NSExceptionName const NSOldStyleException;
*/
//比較
//錯誤物件:可以封裝錯誤資訊,為恢復操作提供基礎資訊,cocoa框架支援。 難維護,難理解,可讀性差,與程式邏輯放在一起。
//異常:檢測異常和處理異常操作分開,提高了程勳可維護性。檢測異常到處理異常的自動化。 浪費資源,降低程式效能,cocoa框架,不是異常安全式框架。
}
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end