🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

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

例外処理

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

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

2回答

11619閲覧

例外の場合処理を終了させたい

nekosuke123

総合スコア6

C#

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

例外処理

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

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2020/12/04 09:02

前提・実現したいこと

WPFでシステムを作っているのですが、処理の終了のさせ方が分からず躓いてしまったので質問させていただきます。

発生している問題・エラーメッセージ

値を呼び出すクラスメソッドを呼び出し、そのメソッド内で値を取得してメインメソッドに返すというプログラムを作っているのですが、相対を呼び出すクラスメソッド内で例外が発生した場合にアプリを閉じずに処理を終了?なかったことに?したいです。

該当のソースコード

C#

1//Main.xaml.cs 2 new Master_select();

C#

1//Yobidashi.cs 2public Yobidashi() 3 { 4 try{//データーベースから値取得} 5 catch(//例外発生){ 6         MessageBox.Show("エラー"); 7        //ここで処理を終了?なかったことに?させたい。 8 } 9 10 }

試したこと

Environment.Exit(0);とかを使ってしまうとアプリごと落ちてしまいますよね?
アプリが落ちずに処理を終了して、メッセージのみを表示して処理を終了させたいです。
returnで何かしらエラーコードを返して、メインでreturnをもう一度するという方法もやったのですが、そんな回りくどいことをしなくてもいい方法もあるんでしょうか。
初心者のため知らないことばかりですみません。お手柔らかにお願いします。

補足情報(FW/ツールのバージョンなど)

Visual Studio 2019

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

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

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

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

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

Zuishin

2020/12/04 09:07 編集

「お手柔らかに」と言うより、適当な? エクセル? ワード? をユーセジ? ユース? スピーク? しないほうが? いいんじゃなくなくなくたいですか?
退会済みユーザー

退会済みユーザー

2020/12/04 09:29 編集

> なかったことに?したいです。 そういうバカげたことは、Don't even think about it
gentaro

2020/12/04 13:01

そもそも論としてコード貼るならちゃんとしたものを貼ってください。 C#の文法に違反したコードを書かれても無意味です。
papinianus

2020/12/05 16:20

> returnで何かしらエラーコードを返して、メインでreturnをもう一度するという方法もやったのですが、そんな回りくどいことをしなくてもいい方法もあるんでしょうか。 これは目的が達成できている、と理解しました。そのコードが回りくどいかどうかは実装依存なので実装を開示していただかないと回答不能です。 もし、目的が達成できていないのなら、終了させたいのか、なかったことにしたいのか、ゴールを具体化してほしいです。そのうえでそこでどのような処理がおこなわれるのか具体的にお示しいただけると助かります。(回答には、どのような副作用が生じるコードでどのような exception が発生し得るか、が必要だと考えております)
dodox86

2020/12/06 03:08

質問の本筋ではない指摘なのですが、「相対を呼び出すクラスメソッド」の"相対"とは何なのだろう、と思いました。用語の使い方が少々雑なのか、私が知らないだけか。"相対"について関連しそうなものをググってもせいぜいCOBOLでの"相対ファイルを読み出す"くらいでした。
guest

回答2

0

ベストアンサー

例外が発生した場合にアプリを閉じずに処理を終了?なかったことに?したいです。

その例外の種類にもよりますが、「例外」=「予測できないもしくは予測はできても何の対応もできない」という類の例外であればなかったことにするということはあり得ません。

そんな話は聞く耳持たない、自分は自分のやり方でやる、それ以外のレスは不要ということであれば以下はスルーしてください。

.NET アプリの例外処置について、自分的に一般的と思うことを書きます。

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

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

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

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

(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 してランタイムに拾わせてアプリケーションを停止させるというものです。(注: 外側の try は何が起こっても finally で接続を Close してリソースリークを防ぐためのものです。内側の try - catch に注目してください)

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

投稿2020/12/06 02:51

編集2020/12/06 02:58
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

あなたのコードなんですから、あなたが考えないとダメですがな。

単にリターンさせるってだけではダメなんですか?

投稿2020/12/04 09:05

y_waiwai

総合スコア88038

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

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

退会済みユーザー

退会済みユーザー

2020/12/04 09:31

ノイズにノイズを加えているような感じですね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問