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

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

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

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

例外

例外(exception)とは、プログラムの処理実行中に発生する、通常の処理の続行を妨げる特殊な事象のことを呼びます。この「例外」が発生した場合に、現在の処理を中断し、変わりに別の処理を実行させる事を「例外処理」と呼びます。

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

Q&A

解決済

2回答

2207閲覧

エラーをキャッチした後

fruitpunch

総合スコア6

C#

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

例外

例外(exception)とは、プログラムの処理実行中に発生する、通常の処理の続行を妨げる特殊な事象のことを呼びます。この「例外」が発生した場合に、現在の処理を中断し、変わりに別の処理を実行させる事を「例外処理」と呼びます。

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

0グッド

0クリップ

投稿2021/10/21 03:49

try&catchでthrow new Exceptionでエラーをキャッチした場合でもそのまま止まらずにつぎに進むことは可能でしょうか?? たとえば

C#

1try{ 2 string[] data1 = System.IO.File.ReadAllLines(@"filepath1"); 3 string[] data2 = System.IO.File.ReadAllLines(@"filepath2"); 4 string[] data3 = System.IO.File.ReadAllLines(@"filepath3"); 5 6 int[] array1 = Array.ConvertAll(file1, int.Parse); 7 if (array1 == null || array1.Length == 0) 8 { 9 throw new Exception("Empty file"); 10 } 11 //なにかする。。。 12 13 int[] array2 = Array.ConvertAll(file2, int.Parse); 14 if (array2 == null || array2.Length == 0) 15 { 16 throw new Exception("Empty file"); 17 } 18          //なにかする。。 19 20 int[] array3 = Array.ConvertAll(file3, int.Parse); 21 if (array3 == null || array3.Length == 0) 22 { 23 throw new Exception("Empty file"); 24 } 25          //なにかする。。 2627 catch (FileNotFoundException ex) 28 { 29 Console.WriteLine(ex.Message); 30 }

file1が仮に空のファイルで、エラーをキャッチしたとしても、そのままarray2に進むことは可能なのでしょうか??
質問がわかりづらくて申し訳無いですが、どなたか回答お願いします。

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

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

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

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

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

dodox86

2021/10/21 03:56

ちょっと謎なご質問なようです。"throw new Exception..."とご自身でコードを書いているのですから、それすなわちそこで例外処理に移行すべく、catch節で捉えられるよう自分で制御していることになるのですが。 > そのままarray2に進むことは可能なのでしょうか?? 進めたいなら、そうなるようにコードを書くのです。
YAmaGNZ

2021/10/21 03:56

それぞれtry-catchすればいいのでは?
guest

回答2

0

ベストアンサー

try&catchでthrow new Exceptionでエラーをキャッチした場合でもそのまま止まらずにつぎに進むことは可能でしょうか??

質問のコードの catch (FileNotFoundException ex) を catch (Exception ex) にすれば try 句の中で発生した throw new Exception("Empty file"); を含むすべての例外を握りつぶしてなかったことにできるので可能なはずです。

ただし、catch (Exception ex) とするのは悪手ですが。

.NET アプリの例外処置について Microsoft Bolg に書いてあったことを要約して紹介しておきます(Bolg は今はリンク切れです)。自分としては以下のようにするのをお勧めします。

(1) 予測可能で正しい業務フローに戻すことができる「業務エラー」(例:ユーザーの入力間違い)と、予測できないもしくは予測はできても何の対応もできない「例外」(例:DB サーバーダウン)を区別して対処。

(2) 「例外」はランタイムに拾わせてアプリケーションを停止させる。無かったことにして、ユーザが作業を続けられるようにすると、強制的に停止させるより好ましからざる状況に陥るかも(ユーザーが大事なデータを壊したりとか)。

(3) よほどのことがない限り try-catch は書かない。

(4) キャッチせざるを得ない場合でも Execption はキャッチしない。キャッチせざるを得ないとしても範囲を絞る。例えば DB 関係の例外が予測されるなら SqlException に限定して catch し、Number プロパティなどでエラーの内容を調べて対処するとか。

(5) 間違って補足してしまった例外は throw する。(注:catch ブロックでキャッチした例外を throw するとスタックトレースが途切れるので単に throw と書く)

(6) ユーザーへの通知が必要なら、集約的例外処置を利用する。

それから、.NET 4 からは破損状態例外は catch できなくなっているそうですが、「それでも Catch (Exception e) を使用するのはよくない」ということについては以下の記事を見てください。

破損状態例外を処理する
https://docs.microsoft.com/ja-jp/archive/msdn-magazine/2009/february/clr-inside-out-handling-corrupted-state-exceptions

自分が持っている Microsoft の本に、上に書いた原則に則ったサンプルが載っていたので紹介しておきます。

データベースに INSERT する際に PK 制約違反で発生する例外のみ catch して「業務エラー」(2 重登録)としてユーザーに再入力を促し、その他は再 throw してランタイムに拾わせてアプリケーションを停止させるというものです。

public bool InsertAuthors() { var connection = new SqlConnection("接続文字列"); var command = new SqlCommand("INSERT INTO authors VALUES ('172-32-1176', 'White', ...)", connection); try { connection.Open(); try { command.ExecuteNonQuery(); } catch(SqlException sqle) { if (sqle.Number == 2627) { return false; } else { throw; } } } finally { connection.Close(); } return true; }

以下の記事も参考になると思います。

例外の推奨事項
https://docs.microsoft.com/ja-jp/dotnet/standard/exceptions/best-practices-for-exceptions

投稿2021/10/21 04:13

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

fruitpunch

2021/10/21 22:25

すごく勉強になりました!! 丁寧にご説明ありがとうございます!! 破損状態例外処理のサイトはとてもためになりました!!
guest

0

file1が仮に空のファイルで、エラーをキャッチしたとしても、そのままarray2に進む

file1 に関する処理だけの try ブロックを作ればよいのではないでしょうか.

try { //file1の処理 } catch( 略 ){} //array2の処理 //必要なのであれば,また別途 try ブロックにすればいい try { //array2の処理 } catch( 略 ){}

投稿2021/10/21 03:55

fana

総合スコア11632

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

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

fruitpunch

2021/10/21 22:27

アドバイスありがとうございます。 全くそのとおりでした!! ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問