普段はJavaを使っているのですが、故あってC#のソースを簡易レビューすることになりました。
C#を始めてそれほど間もない人間の書いたソースなのですが、以下のようなソースをたびたびみかけます。
try
{
// 処理
}
finally
{
// finally処理
}
C#の場合、Javaとは異なり全ての例外はJavaで言うところの非チェック例外であると認識しています。(ただし、Javaの非チェック例外と同じ扱いをしていいとは思っていませんが……)
呼び出し元に起きうる全ての例外処理を任せるがfinally処理をしたいならば、このような書き方をするのが一般的なのでしょうか。
Javaの場合でもこのような書き方ができることは確認しましたが、Javaの場合は非チェック例外が起きる=バグであることがほとんどなので、このような書き方をする場面はあまりないように思います。
(もちろんチェック例外もthrowsを書けば同じように書くこともできるとは思いますが、自分ならやらないですし、そのようなソースを見たこともないです)
ですので、単に自分がJavaを普段使っているからcatchがないことに違和感を感じるだけなのであれば、この問題はスルーしたいと思います。
C#経験者が周りにいない状況ですので、皆様のお知恵をおかりしたいと思います。よろしくお願いします。
No.2ベストアンサー
- 回答日時:
Javaの場合ですが、わたしは、よくこの書き方をします。
チェック例外でも、非チェック例外でも、例外処理を呼び出し元に任せるような設計にすることはあると思います。
呼び出された方では、例外の処理方法が決められないようなケースではcatchしないし、その場で処理すべき例外ならcatchするようにします。
例外をcatchするべきかということと、finallyで何らかの回復処理をしなければならないこととは、そもそも別の話なので、finally節だけになることがあるのは、自然なことだと思います。
finallyだけということは、finallyですべきことはあるが、そこでは例外をcatchすべきでないからcatchが無いと考えた方がいいでしょう。
逆に用もないのにcatchするのはよくないです。
回答、ありがとうございます。
よくよく考えてみれば、本当に仰る通りですね。
どうも自分がこれまで「try-catch、もしくはtry-catch-finally」と頑なに考えていた部分があるように思います。
これまで作ってきたものが、「起こった例外を別の例外でラップしてthrowする」という設計であったのも、
この考え方を固めてしまった原因のように思います。
catchしたものをそのままthrowするだけなら、throwsを書いてcatchしなければいいわけですよね。
どちらにせよ、例外処理は設計時の重要な項目ですから、この機会に深く掘り下げておこうと思います。
No.1
- 回答日時:
>呼び出し元に起きうる全ての例外処理を任せるがfinally処理をしたいならば、このような書き方をするのが一般的なのでしょうか。
この方法でエラー発生の際の処理が全て記述できるなら、この方法が
一番シンプルだと思います。
以下の2008/12と2009/1に同様な内容の記述があります。
http://blogs.msdn.com/nakama/
ただ、物事には例外があって、業務エラーに類する物については、
呼び出し元に戻してしまえば良いとは一律には決められないので、
エラーの種類によっては、その場で catch する必要のある場合も
存在します。
(例)・ユーザ入力によるDBキー重複 → 知らせて再入力を促す
・DBのロックタイプアウト →必要に応じてリトライ
私は、以前は以下の判断基準でエラー処理を統一させていました。
(1)想定できるエラー(業務エラーに多い)はその場でエラー処理
(2)想定できないエラーは呼び出し元に渡す(catchしない or Throw)
(1)のケースを限定して適用し、それ以外は Catch しない というのが
実用的かも知れません。
回答ありがとうございます。
リンク先のブログ、非常に興味深く読んでいます。(現在進行形)
量も量ですし、かなり重要なポイントだと思うので、じっくり理解したいと思います。
Javaを普段扱ってる人間から見るとちょっと違和感のある記述でも、
equinox2さんのような意見やリンク先のブログなどを見ると「なるほど」と思いますね。
是非他の方の意見も聞いてみたいので、もうしばらく意見を募集してみたいと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java すみません。助けてください。 javaについての質問です。 integerに変換できない数値をエラー 5 2022/05/18 19:16
- C言語・C++・C# C#の基本文法が詳しく書かれている教科書的な本ありますか 2 2023/02/11 03:48
- Java jdk17.06のインストーラーが起動しない 1 2023/03/27 21:58
- Java Javaのソースコード作成が難しいです... 10 2022/11/11 14:06
- JavaScript [Java] Edgeでのアドレスバー非表示について 3 2022/04/20 17:51
- Java Javaの問題なのですが、 永久ループを使って以下に従って数値を出力するプログラムを作成する。 ・1 3 2023/06/06 18:43
- Java JavaでWebページ作成 7 2023/07/21 21:09
- IT・エンジニアリング FORTRAN、COBOL、C、Java、C++とか誰が作ったのですか?言語習い使いまた出て、キリが 4 2023/05/06 23:11
- IT・エンジニアリング バックエンドエンジニアに転職 2 2022/04/07 00:51
- Java オブジェクト指向プログラミングの実践本を紹介してください 3 2022/09/19 04:56
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教える店舗&オフィスのセキュリティ対策術
中・小規模の店舗やオフィスのセキュリティセキュリティ対策について、プロにどう対策すべきか 何を注意すべきかを教えていただきました!
-
[JAVA]try 内の変数を外で!?
Java
-
CloseとDisposeの違い
Visual Basic(VBA)
-
IOException ってどういうときに起こるのでしょうか?
Java
-
-
4
CSVファイルの中で、「 , 」カンマを使いたい
その他(コンピューター・テクノロジー)
-
5
tryの終了
Java
-
6
コマンドプロンプトの「%1」と「%~1」の違いがわからない
その他(プログラミング・Web制作)
-
7
Designer.vbは直接コードをいじってはだめ?
Visual Basic(VBA)
-
8
System.IO.Directory.GetFilesの順番
Visual Basic(VBA)
-
9
C# マルチスレッドにおける例外処理
C言語・C++・C#
-
10
private static という変数の修飾
Java
-
11
同じソリューション内の別のプロジェクトのメソッド呼び出し
C言語・C++・C#
-
12
exeファイルの中身を見ることは可能ですか?
フリーソフト
-
13
バッチでテキストファイルから任意の行のみ取得したい
その他(プログラミング・Web制作)
-
14
<a href=#" …>の意味を教えてください。"
HTML・CSS
-
15
含まない言い方ってどうしたらいいんでしょうか
日本語
-
16
変数名の付け方
Java
-
17
フルパスから最後のディレクトリ名を取得したい。
Visual Basic(VBA)
-
18
exist と exists
英語
-
19
間違えて配置してしまったコントロールの削除
Visual Basic(VBA)
-
20
Junitテストでvoid戻り値メッソドをテストする方法
Java
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【C#/Java?】try-catchでcatch...
-
private subモジュールを他のモ...
-
IF文に時間(何時から何時ま...
-
特定の名前のオートシェイプの...
-
vbaのエラー対応(実行時エラー...
-
【Vb.net】プリンタジョブの取得
-
マクロで、次のコードへ行く前...
-
COBOL OCCURSで指定したデータ...
-
【VBA】エラー処理で別プロシー...
-
シグナル 6(SIGABRT)とは?
-
RaiseEventのメリット
-
エクセルVBAでロックをかけたい
-
ExcelのVBAで、選択したファイ...
-
エクセル画面のちらつきなくす...
-
VBAでBook読み込み時の非表示方...
-
C# 指定時間(秒間)の間処理を...
-
ドリブン??
-
VB6.0で、ランタイムエラーを全...
-
VB6にてネットワーク上にある共...
-
VB6で定時刻処理
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【C#/Java?】try-catchでcatch...
-
private subモジュールを他のモ...
-
IF文に時間(何時から何時ま...
-
マクロで、次のコードへ行く前...
-
特定の名前のオートシェイプの...
-
シグナル 6(SIGABRT)とは?
-
特定のファイルを他のプロセス...
-
ExcelのVBAで、選択したファイ...
-
Excel VBA セルの名前があるか...
-
どう増強すべきか
-
Word VBA。各マクロの間に待ち...
-
【VBA】エラー処理で別プロシー...
-
UWSCのTHREADについて
-
シェルスクリプトでファイル内...
-
ドリブン??
-
Functionで戻り値を複数返す方法
-
iPhoneのニューラルエンジンっ...
-
エクセル VBAで複数セル選択時...
-
COBOL OCCURSで指定したデータ...
-
どうやってもFor文を抜けてしま...
おすすめ情報