質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

2201閲覧

【C#】非同期File.Move()メソッドにおける例外捕捉ができない

hyubyu-n1

総合スコア28

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

1クリップ

投稿2019/09/27 01:06

#実装したい処理内容
abc.txtをxyz.txtに移動する処理

C#

1try{ 2 //例) 3 //string abc = "C:\Sample\abc.txt"; 4 //string xyz = "C:\TEST\xyz.txt"; 5 await Task.Run(()=> File.Move(abc, xyz); 6}catch(UnauthorizedAccessException){ 7 //例外処理 8}

#分からない箇所(表題)
C:\SampleもしくはC:\Testへのアクセスが拒否された場合UnauthorizedAccessExceptionが投げられます。
これは公式ドキュメントにも書かれていますし、実際IDEのエラー出力でも

C#

1 await Task.Run(()=> File.Move(abc, xyz);

で例外が投げられていることを確認しました。
@ITにおいても上に示したtry-catchで例外処理できると書かれています。

タイポはしていませんし、何故例外を捕捉できないのでしょうか?

詳しい方よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takabosoft

2019/09/27 01:53 編集

VisualStudioのバージョンと、使っているフレームワーク(WPFとかUWPとかWinFormsとか)を記載してもらった方が良いかなと思います。 ちなみにコンソールアプリで試したところ、問題なくcatchできました。
hyubyu-n1

2019/09/27 01:38

>ちなみにコンソールアプリで試したところ、問題なくcatchできました。 ありがとうございます。
guest

回答1

0

ベストアンサー

別の例外が発生しているかまたは、非同期のTaskAction内でtry~catch していないから捕捉できないのではないでしょうか。Windows Forms(Visual Studio 2017. Windows 10, .NET Framework 4.5) で試したところでは、以下のようでないと捕捉できませんでした。

C#

1 private async void button1_Click(object sender, EventArgs e) 2 { 3 try 4 { 5 //例) 6 string abc = @"C:\Sample\abc.txt"; 7 string xyz = @"C:\TEST\xyz.txt"; 8#if false 9 // これだとNG 10 await Task.Run(() => File.Move(abc, xyz)); 11#else 12 await Task.Run(() => 13 { 14 try 15 { 16 File.Move(abc, xyz); 17 } 18 catch (UnauthorizedAccessException ex) 19 { 20 Debug.WriteLine("UnauthorizedAccessException: " + ex.Message); 21 } 22 catch (Exception ex) 23 { 24 Debug.WriteLine("Exception: " + ex.Message); 25 } 26 }); 27#endif 28 } 29 catch (UnauthorizedAccessException ex) 30 { 31 Debug.WriteLine("UnauthorizedAccessException: " + ex.Message); 32 } 33 catch (Exception ex) 34 { 35 Debug.WriteLine("Exception: " + ex.Message); 36 } 37 } 38 } 39}

全てのExceptionを捕捉するようにしてみて確認してみてください。

尚、上記コード外側のtry~catchでは一応引っかかるものの、以下のメッセージがデバッグ端末に出力されました。(例外の種別は違いますが、ユーザーコード内でハンドルされていないと言うのが問題)

例外がスローされました: 'System.IO.FileNotFoundException' (mscorlib.dll の中)
型 'System.IO.FileNotFoundException' の例外が mscorlib.dll で発生しましたが、ユーザー コード内ではハンドルされませんでした
ファイル 'C:\Sample\abc.txt' が見つかりませんでした。

投稿2019/09/27 01:56

dodox86

総合スコア9183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hyubyu-n1

2019/09/27 02:07

ありがとうございます、自環境でも例外を捕捉できました 「await Task.Run()内でスローされた例外を呼び出し元で捕捉することはできない」ということですね 勉強になりました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問