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

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

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

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

2回答

7391閲覧

trycatch内での例外をVisualStudioで停止させない方法

yonotsui

総合スコア28

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

1クリップ

投稿2020/02/06 16:02

編集2020/02/06 16:03

外部のライブラリを使用しているとtrycatchを使わなければ例外を回避できないケースが多々あります。
VisualStudioではtrycatch内での例外でも一時停止されるため作業するときに困っています。
例外設定からその例外をオフにすれば一時停止はされなくなりますが、そのほかの例外でも停止しなくなるため極力やりたくありません。
なにか解決方法があれば教えていただけると幸いです。

C#

1 string a = ""; 2 try 3 { 4 //止まってほしくない 5 var b = a[0]; 6 } 7 catch (Exception ex) 8 { 9 10 } 11 //止まってほしい 12 var c = a[0];

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/02/06 21:22

予測できない、または予測できても何もの対応もできない例外 (例えば、DB サーバーダウン) は catch せず、ランタイムに拾わせてアプリケーションを停止するのが基本で、そもそも try-catch は書く必要はないと思うのですが?
Zuishin

2020/02/06 23:32

例外が発生しないよう書けばいいと思います。
maisumakun

2020/02/07 00:10

どのような状況・頻度で例外が発生するのですか?
guest

回答2

0

VisualStudioではtrycatch内での例外でも一時停止されるため作業するときに困っています。

何が困るのか、何がしたいのか質問文からは分かりませんでしたが、そもそも try - catch の使い方を十分に理解してなくて、やらなくてもいい(たぶん、やるべきではない)ことを考えているような気がします。(もし、違ったら失礼しました)

予測できないもしくは予測はできても何の対応もできない「例外」(例えば DB サーバーダウン)が発生した場合は、ユーザーがそのまま作業を続けて事態を悪化させないためにも、例外をランタイムに拾わせてアプリケーションを停止させるべきです。

また、質問のコードは catch (Exception ex) と Exception をキャッチして例外を握りつぶしていますが、それも感心しません。

予測可能で正常な業務フローに戻せる業務エラー(例えばユーザーの入力ミスなど)を処理するという目的ならほかにもっとマシな手段がありそうです。

例外発生でアプリを停止する際にユーザーへの通知が必要なら集約的例外処置という手段を取るべきです。

上記の詳しい話は以下の記事に書いてありますので一読されることをお勧めします。

.NETの例外処理 Part.1
https://blogs.msdn.microsoft.com/nakama/2008/12/29/net-part-1/

.NETの例外処理 Part.2
https://blogs.msdn.microsoft.com/nakama/2009/01/02/net-part-2/

記事の内容を簡単にまとめると:

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

(2) 「例外」はランタイムに拾わせてアプリケーションを停止させる。

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

(4) キャッチせざるを得ない場合でも Execption はキャッチしない。(範囲を絞る。例えば DB 関係の例外で予測される SqlException に限定して catch するとか)

(5) 間違って補足してしまった例外は throw する。例えば SqlException に含まれる PK 制約違反だけは「業務エラー」として処置したいが、その他が原因で発生した SqlException を catch してしまった場合。(注: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

投稿2020/02/07 00:49

編集2020/02/07 00:50
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ベストアンサー

VisualStudioの例外設定を見たのであれば、分かると思いますが、例外設定は例外の型単位でしか指定できません。
ですので、取れる選択肢は2つです。

型の変更

止めたい例外・止めたくない例外の型を変える。止めたくない例外はApplicationExceptionなどがよいでしょう

場所の変更

止めたくない例外の発生場所を別のDLLなどにすることです。
そのうえで例外設定のExceptionを右クリック>条件の編集 でモジュール名で止まるモジュールを指定します。

投稿2020/02/07 00:00

soi013

総合スコア149

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問