
普段は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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
「タイプ初期化子が例外をスローしました」エラー何?
Visual Basic(VBA)
-
private static という変数の修飾
Java
-
フルパスから最後のディレクトリ名を取得したい。
Visual Basic(VBA)
-
-
4
CloseとDisposeの違い
Visual Basic(VBA)
-
5
コマンドプロンプトの「%1」と「%~1」の違いがわからない
その他(プログラミング・Web制作)
-
6
Visual Studio 「AnyCpu」について
C言語・C++・C#
-
7
有無、要否、賛否、是非、可否、当否…これらの言葉について
その他(教育・科学・学問)
-
8
エクセルのデータグループ化の際に貼り付けた図だけ一緒に折りたたんでくれません!
Windows Vista・XP
-
9
DBの定義のサイズを大きくし過ぎると問題ある?
その他(データベース)
-
10
[JAVA]try 内の変数を外で!?
Java
-
11
SQLで特定の項目の重複のみを排除した全項目を取得する方法
その他(プログラミング・Web制作)
-
12
「指定されたキャストは有効ではありません。」とエラーが出てしまいます。
Microsoft ASP
-
13
含まない言い方ってどうしたらいいんでしょうか
日本語
-
14
batである文字列内に特定の文字列が含まれているか確認したい
その他(プログラミング・Web制作)
-
15
tryの終了
Java
-
16
UMLでの例外処理
その他(プログラミング・Web制作)
-
17
FTPエラー425
その他(コンピューター・テクノロジー)
-
18
DataGrdViewに関連付けたデータの更新
C言語・C++・C#
-
19
Javascript_submit()完了後に処理したい
JavaScript
-
20
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【C#/Java?】try-catchでcatch...
-
【C#】Page_Loadさせない方法に...
-
Functionで戻り値を複数返す方法
-
Excel VBA セルの名前があるか...
-
private subモジュールを他のモ...
-
For ~ Next文
-
エクセル VBAで複数セル選択時...
-
ExcelのVBAで、選択したファイ...
-
どう増強すべきか
-
どうやってもFor文を抜けてしま...
-
複数個のTextBoxでいずれかの内...
-
マクロで、次のコードへ行く前...
-
IF文に時間(何時から何時ま...
-
LoadPicture のオートメーショ...
-
C言語のGOTO文(組み込み系)
-
サブリミナルプログラムを作成...
-
VBA 複数の行を高速で削除する...
-
エクセルVBAでプロシージャ名を...
-
vbaのエラー対応(実行時エラー...
-
バッチファイルでカレントディ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【C#/Java?】try-catchでcatch...
-
private subモジュールを他のモ...
-
vbaのエラー対応(実行時エラー...
-
シグナル 6(SIGABRT)とは?
-
IF文に時間(何時から何時ま...
-
マクロで、次のコードへ行く前...
-
Excel VBA セルの名前があるか...
-
どう増強すべきか
-
特定の名前のオートシェイプの...
-
途中で処理を中断させたい (ア...
-
特定のファイルを他のプロセス...
-
順番に処理させたい
-
Word VBA。各マクロの間に待ち...
-
StatusStripの表示が更新されな...
-
ドリブン??
-
ExcelのVBAで、選択したファイ...
-
RaiseEventのメリット
-
【VBA】エラー処理で別プロシー...
-
エクセルVBAでロックをかけたい
-
どうやってもFor文を抜けてしま...
おすすめ情報