嗨大家我有一个类我想将用户重定向到错误页面,如果它是:未捕获的异常,捕获的异常或自定义异常。我还想删除错误电子邮件。 (以便我通知)。
我无法访问此类中的当前视图控制器(在未捕获的异常情况下)。因为它是由委托监听器onUncaughtException(NSException* exception)
触发的。
如何访问当前视图控制器,或者将模块重定向用户模式重定向到错误视图控制器?
#import "ErrorHelper.h"
#import "ErrorViewController.h"
#import "Global.h"
#import "AppDelegate.h"
@implementation ErrorHelper
+(void) handleUncaughtError:(NSException*) exception
{
NSLog(@"Uncaught exception occurred!");
[self sendErrorEmailIfAppropriate:exception :nil];
[self redirectToErrorPage];
}
+(void) handleCaughtError:(NSException*) exception
{
NSLog(@"Error caught!!");
[self sendErrorEmailIfAppropriate:exception :nil];
[self redirectToErrorPage];
}
+(void) handleCaughtCustomError:(NSString*) ref :(NSString*) details
{
NSLog(@"Custom error caught!!");
//can do conditional branching on @ref, to do appropriate action.
[self sendErrorEmailIfAppropriate:nil :details];
[self redirectToErrorPage];
}
+(void) sendErrorEmailIfAppropriate:(NSException*) exception :(NSString*)details
{
if([[Global get] isInTestMode] || [[Global get] isInLiveMode]) {
bool isCustomException = details != nil;
}
}
+(void) redirectToErrorPage
{
/*Try redirect user to error page
E.G:
-There's been an error, our App Dev team will try and resolve the issue for you
-Regards -Dev team
*/
AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
}
@end
答案 0 :(得分:4)
您应该假设Cocoa异常是不可恢复的。不要抛弃它们,不要将它们添加到您的程序中。 (在C ++中使用异常是好的,尽管在这方面混合使用C ++和ObjC可能是不安全的,因为ObjC不是为此控制流而设计的,也不是在放松时清理)。
有一些奇怪的ObjC API抛出,你可以从其中一些恢复。如果可能,请使用不抛出的替代方案。如果您在此方案中必须尝试/捕获,那么您应该使您的处理程序尽可能地位于调用点的本地。假设未被捕获的ObjC异常或由高级处理程序捕获的异常是不可恢复的。
现在,因为您捕获的异常是调用站点的本地异常,您可以轻松添加逻辑以将错误传播到视图控制器或返回到事件循环(例如AlertView)。是的,在这种情况下,您可能会有一些错误输出参数或返回值。
电子邮件是一个单独的问题。
答案 1 :(得分:1)
如果你真的想要实现这一点,你可以尝试类似的事情,
1 - 将当前屏幕对象存储在viewDidAppear方法中的UIViewController对象(应用程序级别)中。
2 - 这将为您提供应用程序中的当前屏幕。
(我没有测试过这个,但我认为应该可行)
3 - 发送通知(bcoz现在你有当前的屏幕实例)。
4 - 显示错误页面
答案 2 :(得分:1)
在main.m类中使用 -
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
int retVal = -1;
@try {
retVal = UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
@catch (NSException* exception) {
NSLog(@"Uncaught exception: %@", exception.description);
--Send email here or Open ur link or Wat ever action u'd like to do or Use the Error helper class of urs HERE--
}
[pool release];
return retVal;
这个想法是由于任何对象引起的所有崩溃最终将通过main.m类,这是在整个应用程序生命周期中看到崩溃的最佳位置。
答案 3 :(得分:1)
请参阅Showing an alert in an iPhone top-level exception handler以获取有关如何安装全局异常处理程序的信息..但正如justin所说,异常应被视为'致命' - 您可以打开网址/显示网页视图甚至
但之后不要尝试恢复正常操作
答案 4 :(得分:1)
我试过这个:exception_handler它的工作!只需编写您的电子邮件发送代码而不是警报视图。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[window makeKeyAndVisible];
NSSetUncaughtExceptionHandler(&exceptionHandler);
return YES;
}
BOOL exceptionAlertDismissed = FALSE;
void exceptionHandler(NSException *exception)
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"App Committed Suicide"
message:@"Oh dear, that wasn't supposed to happen. You will have to restart the application... sorry!"
delegate:[[UIApplication sharedApplication] delegate] cancelButtonTitle:nil otherButtonTitles:@"That's ok!", @"Erm, bye...", nil];
[alert show];
[alert release];
while (exceptionAlertDismissed == FALSE)
{
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
}
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
exceptionAlertDismissed = TRUE;
}
在界面中,
@interface ...appDelegate : NSObject <UIApplicationDelegate, UIAlertViewDelegate>
...
void exceptionHandler(NSException *exception);