2012-02-29 6 views
7
MonoTouchでは

、どのように私はキャッチされない例外ハンドラ(または同様の機能)を登録しますMonoTouch:uncaughtExceptionHandler? OBJの-Cで

void uncaughtExceptionHandler(NSException *exception) { 
     [FlurryAnalytics logError:@"Uncaught" message:@"Crash!" exception:exception]; 
    } 

- (void)applicationDidFinishLaunching:(UIApplication *)application { 
    NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler); 
    [FlurryAnalytics startSession:@" "]; 
    .... 
} 

答えて

-4

あなたはNSExceptionsを投げる(かもしれない)というコードの周りのtry-catchハンドラを追加:

try { 
    FlurryAnalytics.StartSession (" "); 
} catch (MonoTouchException ex) { 
    Console.WriteLine ("Could not start flurry analytics: {0}", ex.Message); 
} 

MonoTouchは、すでにキャッチされていない例外ハンドラをインストールし、これらのObjectiveC例外を管理例外に自動的に変換します。

+2

これは実際に彼の元の質問に対処していません。 –

1
public delegate void NSUncaughtExceptionHandler(IntPtr exception); 

    [DllImport("/System/Library/Frameworks/Foundation.framework/Foundation")] 
    private static extern void NSSetUncaughtExceptionHandler(IntPtr handler); 

    // This is the main entry point of the application. 
    private static void Main(string[] args) 
    { 
      NSSetUncaughtExceptionHandler(
       Marshal.GetFunctionPointerForDelegate(new NSUncaughtExceptionHandler(MyUncaughtExceptionHandler))); 

      ... 
    } 

    [MonoPInvokeCallback(typeof(NSUncaughtExceptionHandler))] 
    private static void MyUncaughtExceptionHandler(IntPtr exception) 
    { 
     var e = new NSException(exception); 
     ... 
    } 
+0

素晴らしいです、ありがとうございます! IntPtrをとるNSExceptionのコンストラクタは保護されているため、それをサブタイプ化してそのコンストラクタのバージョンを公開する必要があります。そうでなければ、これは非常に有用でした。 –

+0

[Here](http://stackoverflow.com/questions/37525472/create-nsexception-from-intptr/37527174#37527174) 'NSException'が引数として' IntPtr'を受け入れる方法を見ることができます。 – testing

0

これは機能します。アプリの起動時にSetupExceptionHandling()メソッドを呼び出します。魔法はNSRunLoopの部分です。しかし、その時点でアプリケーションは予期せぬ効果で奇妙な状態になるだろう。したがって、ユーザーが例外を処理する方法を決定した後に、アプリケーションを強制終了することを強くお勧めします。たとえば、再スローするなどです。

public static class IOSStartupTasks { 
    private static bool _HaveHandledException; 
    public static void HandleException(object sender, UnhandledExceptionEventArgs e) { 
    if (!(_HaveHandledException)) { 
     _HaveHandledException = true; 
     UIAlertView alert = new UIAlertView("Error", "Bad news", "report", "just crash"); 
     alert.Delegate = whatever; // delegate object should take the exception as an argument and rethrow when it's done handling user input. 
     alert.Show(); 
     NSRunLoop.Current.RunUntil(NSDate.DistantFuture); // keeps the app alive, but likely with weird effects, so make sure you don't let the user back into the main app. 
    } 
    } 

    public static void SetupExceptionHandling() { 
    AppDomain domain = AppDomain.CurrentDomain; 
    domain.UnhandledException += (object sender, UnhandledExceptionEventArgs e) => 
     IOSStartupTasks.HandleException(sender, e); 
    } 
}