3

我在应用程序中使用以下代码:

@try {
        if(!self.usernameField.text || [self.usernameField.text isEqualToString:@""])
            [NSException raise:@"Invalid value for username" format:@"Please enter your username."];

        if(!self.passwordField.text || [self.passwordField.text isEqualToString:@""])
            [NSException raise:@"Invalid value for password" format:@"Please enter your password."];


        [LoginManager
         userLogin:self.usernameField.text
         andPassword:self.passwordField.text
         success:^(AFHTTPRequestOperation *op, id response) {

             if([self.delegate respondsToSelector:@selector(loginSuccessWithUserName:)]) {
                 [self.delegate performSelector:@selector(loginSuccessWithUserName:)withObject:self.usernameField.text];
             }

             [self dismissPopoverController];
         }
         failure:^(AFHTTPRequestOperation *op, NSError *err) {
             NSString* nsLocalizedRecoverySuggestion = [err.userInfo objectForKey:@"NSLocalizedRecoverySuggestion"];

             if(err.code == -1009) {

                 [NSException raise:@"No Internet connection" format:@"It appears you’re not connected to the internet, please configure connectivity."];
             }

             if([nsLocalizedRecoverySuggestion rangeOfString:@"Wrong username or password."].location != NSNotFound) {

                 [NSException raise:@"Invalid username or password" format:@"Your given username or password is incorrect"];
             }
             else {
                 [NSException raise:@"BSXLoginViewController" format:@"Error during login"];
             }
         }];
    }
    @catch (NSException *exception) {
        UIAlertView* alert = [[UIAlertView alloc]initWithTitle:@"Login error"
                                                       message:exception.description
                                                      delegate:self
                                             cancelButtonTitle:@"Ok"
                                             otherButtonTitles:nil];
        [alert show];
    }

但是,在故障块中引发的异常不会在 catch 部分中捕获。我有点理解为什么这是合乎逻辑的,但我想知道是否有办法告诉块内部发生的异常应该由我创建的 catch 部分处理。

谢谢你的帮助!

真诚的,佐利

4

2 回答 2

6

不要这样做。首先,我相信你至少会从@bbum 那里得到一个关于这个的评论,NSException在 Objective-C 中不是为了可恢复的错误和通过代码传播可恢复的错误(参见Cocoa 异常编程主题简介) . 相反,Objective-C 中使用的构造NSException基本上是用于不可恢复的编程错误,并使用NSError对象来处理可恢复的错误。

但是,您在这里遇到了一个更大的问题,因为您正在进行的调用具有阻塞回调,因为它们在完成之前返回。在这种情况下,您的异常处理程序在实际引发异常之前很久就退出了。

在这种情况下,我建议failure:通过调度到主队列并在UIAlert那里显示来删除异常并处理实际块内的错误。

于 2013-06-10T13:32:11.327 回答
1

不要被您的块与其他代码内联指定的事实所迷惑。您无法在外部(非块)代码的块中捕获异常,因为 TRY 块中的代码已经执行(并退出)并且该块仅在其自己的范围内执行。

一个解决方案是在块中捕获异常。

于 2013-06-10T13:24:48.543 回答