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

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

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

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

Q&A

解決済

4回答

3681閲覧

try-catchをusingにした場合、catchのreturn nullはどこに書けばよいですか?

almond

総合スコア7

C#

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

0グッド

0クリップ

投稿2017/11/30 07:36

###前提・実現したいこと
try-catchをusingにした場合、catchのreturn nullはどこに書けばよいですか?
try-catchは不要ですか?

###発生している問題・エラーメッセージ
try-catchをusingにしてみました。
こうするとtry-catchは不要に見えます。
なくした場合、return nullはどこに書くものでしょう?

###該当のソースコード

C#

1using MySql.Data.MySqlClient; 2using System; 3using System.Data; 4 5namespace MySQLAccess 6{ 7 public class MySQL 8 { 9 public DataSet Select() 10 11 string query = "select * From MyTable;"; 12 var command = new MySqlCommand(query, Connection); 13 try 14 { 15 var dataadapter = new MySqlDataAdapter(query, Connection); 16 var dataset = new DataSet(); 17 dataadapter.Fill(dataset); 18 return dataset; 19 } 20 catch (Exception exception) 21 { 22 return null; 23 } 24 } 25 } 26}

C#

1using MySql.Data.MySqlClient; 2using System; 3using System.Data; 4 5namespace MySQLAccess 6{ 7 public class MySQL 8 { 9 public DataSet Select() 10 11 string query = "select * From MyTable;"; 12 using (var command = new MySqlCommand(query, Connection, transaction)) 13 { 14 try 15 { 16 var dataadapter = new MySqlDataAdapter(query, Connection); 17 var dataset = new DataSet(); 18 dataadapter.Fill(dataset); 19 transaction.Commit(); 20 return dataset; 21 } 22 catch (Exception exception) 23 { 24 return null; 25 } 26 } 27 } 28 } 29}

###補足情報(言語/FW/ツール等のバージョンなど)
Visual Studio

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

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

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

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

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

guest

回答4

0

こんにちは。

usingはtry-catchでできることの全てを行えうものではありません。
関数内で獲得したリソースの開放漏れを防ぐのが目的の機能です。例外を補足しないとできない処理(catchしてreturnはその一つです)をusingで行うことはできません。

従って、

こうするとtry-catchは不要に見えます。

なくした場合、return nullはどこに書くものでしょう?

catch内でreturn nullしたい場合はtry-catchは必要です。

投稿2017/11/30 07:55

編集2017/11/30 07:57
Chironian

総合スコア23272

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

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

almond

2017/12/01 04:41

こんにちは。ありがとうございます。
guest

0

ベストアンサー

try-catchをusingにした場合、catchのreturn nullはどこに書けばよいですか?

そもそもの認識に誤りがあります。tyr/catchとusingそれぞれが提供する機能は全く別の目的なので、どちらかがもう一方を代替するなどということはできません。
例外を処理したいのならtry/catchを使ってください。自動でDisposeさせたいのならusingを使ってください。例外を処理しつつ自動でDisposeさせたいのなら、try/catchとusing両方を使ってください。

投稿2017/11/30 08:53

catsforepaw

総合スコア5938

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

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

almond

2017/12/01 04:37

ありがとうございます。頭を整理できました。 例外の処理が必要なので、usingに加えてtry-catchします。
guest

0

try-catchをusingにした場合、catchのreturn nullはどこに書けばよいですか?
try-catchは不要ですか?

using が try-catch の代わりにはならないことは他の回答者の方が答えられているので、別の問題についてレスします。

それは何かと言うと例外処置で、特に Exception をキャッチして全ての例外を握りつぶしているのは絶対やってはいけないことです。

例外処置について、自分的に一般的と思うことを書きますと:

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

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

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

(4) キャッチせざるを得ない場合でも Execption はキャッチしない。

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

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

詳しくは以下の記事を見てください。

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/

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

破損状態例外を処理する
https://msdn.microsoft.com/ja-jp/magazine/dd419661.aspx

その他、

質問者さんが書いたコードの using の例は MySqlCommand を確実に Dispose するという意味しかありません。(IDisposable を継承しているクラスは原則使い終わったら Dispose すべきですが、Command の場合あまり意味はない)

通常、ADO.NET を使って DB にアクセスするケースで using を使うのは、接続(MySQL で Connector/NET を使った場合は MySqlConnection)が必ず Dispose(Close と同じ)されるようにし、リソースリーク(この場合は、接続プールにおける接続の枯渇)を防止するためです。そのあたりと混同してませんか? 詳しくは上に紹介した記事の Part 2 を見てください。

ただし、MySqlDataAdapter を利用した場合は、その内部で Open / Close は自動的に行ってくれますので、上で言うリソースリークの心配はないのですが。

投稿2017/11/30 08:42

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

almond

2017/12/01 04:41

コメントありがとうございます。 開発中なので、try-catchあります。
退会済みユーザー

退会済みユーザー

2017/12/02 03:17

> 開発中なので、try-catchあります。 それは全く理屈が通りません。質問者さんは全くの初学者のようですので理解しがたいのかもしれませんが、重要のことなのでよく考えて見てください。 むしろ開発中だからこそ try - catch で Exception を catchすべきではないはずです。 特に質問に書いてあったようなコードですと、問題の原因究明と対策に必要な情報を自ら破棄しているようなものです。(null が返ってきたら何らかの問題で DataSet は生成できなかったことは分かるかもしれませんが、何がその原因になったのかを究明するのは困難。結局例外情報が必要で Exception は catch しないようコードを書き換えることになるのでは?)
guest

0

不要とはどういうことでしょうか?
usingは確実にDisposeするだけで、例外処理をしてくれるわけではありません。
なくした場合、呼び元に例外が飛ぶかもしれません。

投稿2017/11/30 07:45

x_x

総合スコア13749

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

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

almond

2017/12/01 04:42

コメントありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問