C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

タスクで発生した例外をキャッチできない

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■92644 / inTopicNo.1)  タスクで発生した例外をキャッチできない
  
□投稿者/ tosh (7回)-(2019/10/17(Thu) 11:20:42)

分類:[C#] 

お世話になります。

タスク内で発生した例外をキャッチする方法、検索すると見つかるのですが
書いてある通りに実装してもキャッチできません。
試しに新規作成したプロジェクトにサンプルコードをそのままコピペして実行しても
やはりキャッチできず、タスク内で例外をthrowした時点でエラーになってしまいました。
複数のサイトで同じ方法が書いてあり、間違いではない筈なので
VisualStudioの設定とか、ソース以外の問題ではないかと思うのですが
何が問題なのでしょうか。
参考にしたサンプルコードを以下に記します。よろしくお願いいたします。

using System;
using System.Threading.Tasks;
 
namespace test
{
    class Program
    {
        static void Main()
        {
            var task = Task.Factory.StartNew(() =>
            {
                throw new Exception("Test Exception");
            });
            try
            {
                task.Wait();
            }
            catch (AggregateException exception)
            {
                foreach (var inner in exception.InnerExceptions)
                    Console.WriteLine(inner.Message);
            }
        }
    }
}

引用返信 編集キー/
■92645 / inTopicNo.2)  Re[1]: タスクで発生した例外をキャッチできない
□投稿者/ WebSurfer (1949回)-(2019/10/17(Thu) 12:10:55)
No92644 (tosh さん) に返信

> タスク内で発生した例外をキャッチする方法、検索すると見つかるのですが
> 書いてある通りに実装してもキャッチできません。
> 試しに新規作成したプロジェクトにサンプルコードをそのままコピペして実行しても
> やはりキャッチできず、タスク内で例外をthrowした時点でエラーになってしまいました。

その「サンプルコード」が記載されている記事の URL を書けませんか?
引用返信 編集キー/
■92646 / inTopicNo.3)  Re[1]: タスクで発生した例外をキャッチできない
□投稿者/ とっちゃん (640回)-(2019/10/17(Thu) 12:11:39)
No92644 (tosh さん) に返信

> タスク内で発生した例外をキャッチする方法、検索すると見つかるのですが
> 書いてある通りに実装してもキャッチできません。
> 試しに新規作成したプロジェクトにサンプルコードをそのままコピペして実行しても
> やはりキャッチできず、タスク内で例外をthrowした時点でエラーになってしまいました。
> 複数のサイトで同じ方法が書いてあり、間違いではない筈なので
> VisualStudioの設定とか、ソース以外の問題ではないかと思うのですが
> 何が問題なのでしょうか。
> 参考にしたサンプルコードを以下に記します。よろしくお願いいたします。
>
VS のバージョン、.NET のバージョンは何でしょうか?

VS2019 + .NET Framework 4.8 だと、何の問題もなく例外がトラップされます(Test Exception と画面表示される)。

ちょっと古い記事ですが、こんなのがあります。
https://qiita.com/habu1010/items/08177698fa3826474c0b

この問題と同じではありませんか?

引用返信 編集キー/
■92647 / inTopicNo.4)  Re[2]: タスクで発生した例外をキャッチできない
□投稿者/ Hongliang (900回)-(2019/10/17(Thu) 12:44:00)
Visual Studio 2017までとVisual Studio 2019からで挙動が変わりますね。
※ただし2017はExpress版、2019はCommunity版で確認。あと2013 Express、2010 Professionalで確認。

2017まででは、Task内で未処理の例外が出た場合、一旦そこでブレイクし、未処理例外のダイアログが出ます。「続行」を選べば強制終了することもなく処理が続行し、task.Wait()でAggregateExceptionが改めて発生します。

扱いづらいと文句が出たからかは知りませんが、2019でこの動作が改められ、Task内で未処理の例外が出た場合でもブレイクしなくなっています。

2017でも2019の挙動ができないかちょっと見てみましたが該当する設定はなさそうでした。
引用返信 編集キー/
■92648 / inTopicNo.5)  Re[2]: タスクで発生した例外をキャッチできない
□投稿者/ WebSurfer (1950回)-(2019/10/17(Thu) 12:51:02)
ご参考までの話ですが・・・

> ちょっと古い記事ですが、こんなのがあります。
> https://qiita.com/habu1010/items/08177698fa3826474c0b
>
> この問題と同じではありませんか?

デバッグ実行のときキャッチされないということは、自分が試した限りですが、なかったです。
何が違うのか、上の記事には環境等が書いてないので不明ですが、

VS2015, .NET 4.6.1, Windows Forms アプリ

で、以下の記事のコードの「// async/await/Task を使った非同期呼び出し」の部分が上の記事の
コードに近いものですが、デバッグ実行で例外が捕捉されないということはなかったです。

デバッグなしで実行と異なるのは、MessageBox の表示の前に、Visual Studio のエディタ上で例
のダイアログで詳細が表示されるというところですが、少なくとも例外が捕捉されないということ
はなかったです。

デリゲートを利用した非同期メソッドの実装
http://surferonwww.info/BlogEngine/post/2019/06/19/coding-asynchronous-method-by-using-delegate-in-windows-forms-application.aspx

引用返信 編集キー/
■92649 / inTopicNo.6)  Re[3]: タスクで発生した例外をキャッチできない
□投稿者/ tosh (8回)-(2019/10/17(Thu) 13:54:14)
皆様ありがとうございます。

結論から言うと、Hongliang様のご指摘通り、
私のVS2017開発環境のDebug実行では、タスク内で例外発生時はcatchの前に必ず一回止まる、というだけでした。
もう一回実行ボタンを押せばcatchされる事と、Release環境実行時は例外で落ちないことを確認しました。

上記仕様を知らなかったことに加え、タスクではない場合の例外は止まらずにcatchされるので、早とちりしてしまいました。
お騒がせしました。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ