5

キャッチされていない例外、キャッチされた例外、またはカスタム例外があった場合に、ユーザーをエラーページにリダイレクトしたいクラスがあります。エラーメールもフリックしたい。(私が通知されるように)。

このクラス内の現在のビュー コントローラーにアクセスできません (キャッチされない例外の場合)。デリゲートリスナーでトリガーされるためonUncaughtException(NSException* exception)です。

現在のView Controllerにアクセスするにはどうすればよいですか、またはそれが失敗すると、ユーザーをモーダルにエラーView Controllerにリダイレクトできますか?

#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];
    
}

@終わり

4

5 に答える 5

4

Cocoa の例外は回復不可能であると想定する必要があります。それらをスローしたり、プログラムに追加したりしないでください。(C++ で例外を使用することは問題ありませんが、C++ と ObjC を混在させることは安全ではない可能性があります。これは、ObjC がこの制御フローまたは巻き戻し時のクリーンアップ用に設計されていないためです)。

スローする奇妙な ObjC API がいくつかあり、それらのいくつかから回復することができます。可能であれば、スローしない代替手段を使用してください。このシナリオで try/catchする必要がある場合は、ハンドラーを可能な限り呼び出しサイトに対してローカルにする必要があります。キャッチされていない ObjC 例外、または高レベルのハンドラーによってキャッチされた例外が回復不能であると想定します。

キャッチされた例外は呼び出しサイトに対してローカルであるため、ロジックを簡単に追加して、エラーをビュー コントローラーに伝達したり、イベント ループ (AlertView など) に戻したりできます。はい、この場合、いくつかのエラー出力パラメーターまたは戻り値が導入される可能性があります。

メールは別質問です。

于 2012-11-12T01:12:53.470 に答える
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 クラスを最終的に通過するというものです。

于 2012-11-12T10:22:43.423 に答える
1

グローバル例外ハンドラーをインストールする方法については、 iPhone のトップレベルの例外ハンドラーにアラートを表示するを参照してください。しかし、ジャスティンが言ったように、例外は「致命的」として扱われるべきです。

ただし、その後通常の操作を再開しようとしないでください

于 2012-11-12T10:35:33.937 に答える
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);
于 2012-11-18T08:13:39.327 に答える
1

本当にこれを達成したい場合は、次のようなことを試すことができます。

1 - 現在の画面オブジェクトを viewDidAppear メソッドの UIViewController オブジェクト (アプリケーション レベル) に保存します。

2 - これにより、アプリのどこにいても現在の画面が表示されます。

(私はこれをテストしていませんが、動作するはずです)

3 - 通知を送信します (bcoz で現在の画面インスタンスが作成されました)。

4 - エラーページを表示する

于 2012-11-12T09:57:43.483 に答える