LoginSignup
2
3

More than 3 years have passed since last update.

Xamarin C# 非同期関数内で起きたExceptionをthrowする

Last updated at Posted at 2019-12-18

WindowsBaseパッケージに入ってる
System.Windows.ThreadingのDispatcherを使えば、
別のスレッド上でからメインスレッドでExceptionを起こすことができる。

非同期関数~~~
System.Windows.Threading.Dispatcher.CurrentDispatcher.Invoke(() =>
{
   throw new Exception("メインスレッドでExceptionが起こる");
});
~~~

キャッチするにはApplication.TheradExceptionにイベントを設定しておくと、
ハンドリングされなかったExceptionが飛んでくる

System.Windows.Forms.Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(this.OnThreadException);

private void OnThreadException(object sender, ThreadExceptionEventArgs e) {
}

Xamarin.Androidは以下でできる
Exception発生

非同期関数~~~~
Xamarin.Forms.Device.BeginInvokeOnMainThread(() =>
{
     throw new Exception("メインスレッドでExceptionが起こる");
});
~~~

キャッチ

AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(OnThreadException);

androidはunhandledExceptionイベントが走った時点でアプリが強制終了前提なので、拾ってもログ仕込むくらいのことしかできない
AndroidEnvironment.UnhandledExceptionRaiserを使えばアプリが落ちないとの情報もありましたが、だめでした。
https://qiita.com/ta-yamaoka/items/e374921d642e9ac84b3b
http://atamo-dev.hatenablog.com/entry/2016/10/30/174556

公式に回答ありました。
https://docs.microsoft.com/en-us/dotnet/api/system.appdomain.unhandledexception?redirectedfrom=MSDN&view=netframework-4.8
~~~~~~~~~~~~~~~~~~~~~~~~~
NET Frameworkバージョン1.0および1.1では、メインアプリケーションスレッド以外のスレッドで発生する未処理の例外はランタイムによってキャッチされるため、アプリケーションは終了しません。したがって、アプリケーションを終了せずにUnhandledExceptionイベントが発生する可能性があります。.NET Frameworkバージョン2.0から、子スレッドの未処理の例外のこのバックストップは削除されました。そのようなサイレント障害の累積的な影響には、パフォーマンスの低下、破損したデータ、ロックアップが含まれていたためです。ランタイムが終了しないケースのリストなど、詳細については、「マネージスレッドの例外」を参照してください。
~~~~~~~~~~~~~~~~~~~~~~~~~~~

.Net Framework2.0から強制終了するようにしたみたいですね。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3