Objective-C中try/catch/finally 使用

OC中捕捉异常

你会发现在OC中很少像其他语言那样频繁使用异常处理。然而,try/catch/finally block 可以用来捕获那些导致app发生的错误。

在以下例子中,创建里一个array,然而没有添加任何元素。在try块中试图去访问array的第一个元素会导致异常并抛出。

NSArray* arraytest = [[NSArray alloc] init];
 
@try 
{
  // Attempt access to an empty array
  NSLog(@"Object: %@", [arraytest objectAtIndex:0]);
 
}
@catch (NSException *exception) 
{
  // Print exception information
  NSLog( @"NSException caught" );
  NSLog( @"Name: %@", exception.name);
  NSLog( @"Reason: %@", exception.reason );
  return;
}
@finally 
{
  // Cleanup, in both success and fail cases
  NSLog( @"In finally block");
 
  [arraytest release];
}

代码运行输出如下:

iPhoneApp[4464:b903] NSException caught
iPhoneApp[4464:b903] Name: NSRangeException
iPhoneApp[4464:b903] Reason: *** -[NSArray objectAtIndex:]: index 0 beyond bounds for empty array
iPhoneApp[4508:b903] In finally block

无论@try块是否发生异常,@finally中的代码都会被执行,这里是执行清理工作相关代码的最好地方。

在处理文件相关操作(如NSFileHandleOperationException)时,使用exceptions非常有用。

捕获一个特定异常

像上面的例子中一样使用NSException会捕获所有异常。你也可以只关注某一类异常。如下所示:只关注NSRangeException

@try 
{
  // Attempt access to an empty array
  NSLog(@"Object: %@", [arraytest objectAtIndex:0]);
 
}
@catch (NSRangeException *exception) 
{
  // Print exception information
  NSLog( @"NSRangeException caught" );
  NSLog( @"Reason: %@", exception.reason );
  return;
}
@finally 
{
  // Cleanup, in both success and fail cases
  NSLog( @"In finally block");
 
  [arraytest release];
}

抛出异常

你也可以在一个方法中抛出异常,如下所示testException始终会抛出一个异常

- (void)testException
{
  if (1 == 1) 
  {
    NSException *exception = [NSException exceptionWithName: @"Exception!"
                                                     reason: @"Something not so good occurred."
                                                   userInfo: nil];
    @throw exception;
  }
}

使用try/catch/finally将testException进行包裹调用。如下

@try 
{
  // Call the method...
  [self testException];
}
@catch (NSException *exception) 
{
  // Print exception information
  NSLog( @"NSException caught" );
  NSLog( @"Name: %@", exception.name);
  NSLog( @"Reason: %@", exception.reason );
  return;
}
@finally 
{
  NSLog( @"In finally block");
}

输出如下:

iPhoneApp[4660:b903] NSException caught
iPhoneApp[4660:b903] Name: Exception!
iPhoneApp[4660:b903] Reason: Something not so good occurred.
iPhoneApp[4660:b903] In finally block
    原文作者:iOneWay
    原文地址: https://www.jianshu.com/p/1cb65e05b3ed
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞