如何在 iOS 中的一个地方处理常见错误(可以在一个地方的每个 UIViewController 中引发)?
How to handle common errors (which can raise in every UIViewController in a single place) in a single place in iOS?
我在一个 client/server 应用程序中有很多 UIViewControler。在任何时候(在每个屏幕上)服务器都可能发送一般错误,例如错误的协议序列、反序列化错误等。例如,有没有办法在 AppDelegate 中处理此错误,并根据错误显示特定消息并在特定屏幕上继续显示?
目前,当我收到错误时,我会发送由 AppDelegate 处理的事件,它会找到最顶层的 UIViewController 并显示警报消息。问题是:
1. 我想转到特定的 GeneralErrorsViewController,以便在错误解决之前停止处理任何事情,或者只是停止并根据错误给用户一个选择
2. 当我显示消息时,如果有待处理的 segue 操作,它会切换到下一个 UIViewController 并且消息丢失。
可能是你必须使用 Try Catch 处理错误,
Like below Example
CabCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"CabCell" forIndexPath:indexPath];
//Set Button Image
@try {
[cell.btnCell setImageForState:UIControlStateNormal withURL:[NSURL URLWithString:[[dictBookPagelist[@"data"] objectAtIndex:indexPath.row] valueForKey:Param_vLogo]]];
}
@catch (NSException *exception) {
NSLog(@"%@", exception.reason);
}
@finally {
UIImageView *imageview=[UIImageView new];
[imageview setImageWithURL:[NSURL URLWithString:[[dictBookPagelist[@"data"] objectAtIndex:indexPath.row] valueForKey:Param_vLogo]] usingActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
[cell.btnCell setImage:imageview.image forState:UIControlStateNormal];
}
在一个常见的地方没有内置的错误处理方法。我希望你意识到这是有道理的,因为系统不会知道你想要处理什么类型的错误,也不知道你是否希望所有的错误都以相同的方式或不同的方式处理,比如只对高优先级错误发出警报等。此外,每个视图控制器启动不同的工作流,因此应该有自己的方式来处理错误。例如,如果您在后台进程中进行 Web 服务调用,您可能不希望在用户进行重要金融交易的过程中显示来自该进程的错误,因为显示来自一般 home/settings 屏幕等
因此,根据您的要求处理应用内的错误是您的责任。
如果您想要一种处理错误的通用方法,您可以创建一个带有默认方法的基本视图控制器来处理错误,并从中继承所有其他视图控制器。更好的是,创建一个声明所有错误处理方法的协议(接口),并创建一个自定义的 UIVeiwController 和 UITableViewController,它们以您想要的默认方式实现这些方法。
您可以从 classes.
继承所有视图控制器和 table 视图控制器
我建议不要使用 'segue' 在基础 classes 中显示视图控制器,因为您的所有视图控制器都不会有那个 segue。相反,使用故事板 ID 实例化您的 GeneralErrorsViewController,检查调用视图控制器是否具有非零导航控制器并将其推送到堆栈上。如果导航控制器为零,则以模态方式显示。
这种方法有两个优点。 1.错误处理是集中的,如你所愿。 2. 如果您的应用程序要求一个不处理错误的屏幕以其他方式处理它们,您可以不从基础继承它 class 或继承并覆盖协议方法以满足您的需要。
每个 vc 都可以在遇到错误时调用自己的错误处理方法。但是,如果您希望在出现错误时继续使用您发送事件(通知)的方式,您可以在基础 vc 的 viewWillAppear' and deregister in
viewWillDisappear` 中注册这些通知并调用协议来自通知处理程序的方法并将错误(您可以将其作为对象与错误通知一起传递)传递给协议方法。这样你就不需要在 app delegate 中处理任何事情。
我在一个 client/server 应用程序中有很多 UIViewControler。在任何时候(在每个屏幕上)服务器都可能发送一般错误,例如错误的协议序列、反序列化错误等。例如,有没有办法在 AppDelegate 中处理此错误,并根据错误显示特定消息并在特定屏幕上继续显示?
目前,当我收到错误时,我会发送由 AppDelegate 处理的事件,它会找到最顶层的 UIViewController 并显示警报消息。问题是: 1. 我想转到特定的 GeneralErrorsViewController,以便在错误解决之前停止处理任何事情,或者只是停止并根据错误给用户一个选择 2. 当我显示消息时,如果有待处理的 segue 操作,它会切换到下一个 UIViewController 并且消息丢失。
可能是你必须使用 Try Catch 处理错误,
Like below Example
CabCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"CabCell" forIndexPath:indexPath];
//Set Button Image
@try {
[cell.btnCell setImageForState:UIControlStateNormal withURL:[NSURL URLWithString:[[dictBookPagelist[@"data"] objectAtIndex:indexPath.row] valueForKey:Param_vLogo]]];
}
@catch (NSException *exception) {
NSLog(@"%@", exception.reason);
}
@finally {
UIImageView *imageview=[UIImageView new];
[imageview setImageWithURL:[NSURL URLWithString:[[dictBookPagelist[@"data"] objectAtIndex:indexPath.row] valueForKey:Param_vLogo]] usingActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
[cell.btnCell setImage:imageview.image forState:UIControlStateNormal];
}
在一个常见的地方没有内置的错误处理方法。我希望你意识到这是有道理的,因为系统不会知道你想要处理什么类型的错误,也不知道你是否希望所有的错误都以相同的方式或不同的方式处理,比如只对高优先级错误发出警报等。此外,每个视图控制器启动不同的工作流,因此应该有自己的方式来处理错误。例如,如果您在后台进程中进行 Web 服务调用,您可能不希望在用户进行重要金融交易的过程中显示来自该进程的错误,因为显示来自一般 home/settings 屏幕等
因此,根据您的要求处理应用内的错误是您的责任。
如果您想要一种处理错误的通用方法,您可以创建一个带有默认方法的基本视图控制器来处理错误,并从中继承所有其他视图控制器。更好的是,创建一个声明所有错误处理方法的协议(接口),并创建一个自定义的 UIVeiwController 和 UITableViewController,它们以您想要的默认方式实现这些方法。 您可以从 classes.
继承所有视图控制器和 table 视图控制器我建议不要使用 'segue' 在基础 classes 中显示视图控制器,因为您的所有视图控制器都不会有那个 segue。相反,使用故事板 ID 实例化您的 GeneralErrorsViewController,检查调用视图控制器是否具有非零导航控制器并将其推送到堆栈上。如果导航控制器为零,则以模态方式显示。
这种方法有两个优点。 1.错误处理是集中的,如你所愿。 2. 如果您的应用程序要求一个不处理错误的屏幕以其他方式处理它们,您可以不从基础继承它 class 或继承并覆盖协议方法以满足您的需要。
每个 vc 都可以在遇到错误时调用自己的错误处理方法。但是,如果您希望在出现错误时继续使用您发送事件(通知)的方式,您可以在基础 vc 的 viewWillAppear' and deregister in
viewWillDisappear` 中注册这些通知并调用协议来自通知处理程序的方法并将错误(您可以将其作为对象与错误通知一起传递)传递给协议方法。这样你就不需要在 app delegate 中处理任何事情。