Intro
这部分语法与Java等其他面向对象语言很像,连关键字都一样。
以下代码包含:
@try @catch @finally
的使用
-
如何自定义异常类
-
程序员自己通过
@throw
抛出异常对象
Code
//
// main.m
// 异常处理
//
// Created by wuyujin1997 on 2023/2/23.
//
#import <Foundation/Foundation.h>
@interface Person : NSObject {
@public
NSString* name;
int age;
}
- (void) sayHi;
@end
@implementation Person
// 把 sayHi 方法的实现注释掉
//- (void) sayHi {
// NSLog(@"hello");
//}
@end
// 自定义异常类
@interface WYJNumberException : NSException
@end
@implementation WYJNumberException
@end
int main(int argc, const char * argv[]) {
Person* p = [Person new];
// [p sayHi]; // Thread 1: "-[Person sayHi]: unrecognized selector sent to instance 0x6000002033c0"
@try {
NSLog(@"try代码块");
[p sayHi]; // 这句会抛出异常
NSLog(@"如果上一行代码出错,则这行代码不会被执行");
} @catch (NSException* e) {
NSLog(@"catch代码块:如果try部分有异常抛出,则跳转到catch代码块执行");
NSLog(@"异常对象: %@", e);
} @finally {
NSLog(@"finally代码块:最终一定会执行");
}
NSLog(@"异常处理代码块之后的代码会照常运行(只要这部分代码没有异常)");
// 处理自定义异常
int num = 0;
@try {
if (0 == num) {
WYJNumberException* e = [WYJNumberException exceptionWithName:@"WYJNumberException" reason:@"除数不能为0" userInfo:nil];
@throw e;
}
int result = 6 / num;
NSLog(@"除法的商为:%d", result);
} @catch (WYJNumberException* e) {
NSLog(@"除法运算抛异常了:%@", e);
} @catch (NSException* e) {
NSLog(@"异常对象: %@", e);
} @finally {
NSLog(@"finally代码块执行");
}
return 0;
}
Output
2023-02-25 10:42:21.947898+0800 异常处理[14400:448405] try代码块
2023-02-25 10:42:21.948234+0800 异常处理[14400:448405] -[Person sayHi]: unrecognized selector sent to instance 0x6000002033a0
2023-02-25 10:42:21.948338+0800 异常处理[14400:448405] catch代码块:如果try部分有异常抛出,则跳转到catch代码块执行
2023-02-25 10:42:21.948365+0800 异常处理[14400:448405] 异常对象: -[Person sayHi]: unrecognized selector sent to instance 0x6000002033a0
2023-02-25 10:42:21.948384+0800 异常处理[14400:448405] finally代码块:最终一定会执行
2023-02-25 10:42:21.948401+0800 异常处理[14400:448405] 异常处理代码块之后的代码会照常运行(只要这部分代码没有异常)
2023-02-25 10:42:21.948430+0800 异常处理[14400:448405] 除法运算抛异常了:除数不能为0
2023-02-25 10:42:21.948446+0800 异常处理[14400:448405] finally代码块执行
Program ended with exit code: 0