
普段は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も見ています
-
「タイプ初期化子が例外をスローしました」エラー何?
Visual Basic(VBA)
-
private static という変数の修飾
Java
-
コマンドプロンプトの「%1」と「%~1」の違いがわからない
その他(プログラミング・Web制作)
-
-
4
CloseとDisposeの違い
Visual Basic(VBA)
-
5
DBの定義のサイズを大きくし過ぎると問題ある?
その他(データベース)
-
6
Visual Studio 「AnyCpu」について
C言語・C++・C#
-
7
「指定されたキャストは有効ではありません。」とエラーが出てしまいます。
Microsoft ASP
-
8
フルパスから最後のディレクトリ名を取得したい。
Visual Basic(VBA)
-
9
エクセルのデータグループ化の際に貼り付けた図だけ一緒に折りたたんでくれません!
Windows Vista・XP
-
10
[JAVA]try 内の変数を外で!?
Java
-
11
変数名の付け方
Java
-
12
FORMが開いているかどうかの確認方法
Visual Basic(VBA)
-
13
有無、要否、賛否、是非、可否、当否…これらの言葉について
その他(教育・科学・学問)
-
14
エクセルのセル内の余白の設定って出来るのでしょうか?
Excel(エクセル)
-
15
batである文字列内に特定の文字列が含まれているか確認したい
その他(プログラミング・Web制作)
-
16
tryの終了
Java
-
17
ソースコードの1行が長いときの折り返し
PHP
-
18
DataGrdViewに関連付けたデータの更新
C言語・C++・C#
-
19
SQLで列名を変数にできないでしょうか
SQL Server
-
20
DateTimePickerでに年月までしか選択できないようにしたいです。
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
private subモジュールを他のモ...
-
【C#/Java?】try-catchでcatch...
-
どうやってもFor文を抜けてしま...
-
マクロで、次のコードへ行く前...
-
シグナル 6(SIGABRT)とは?
-
Word VBA。各マクロの間に待ち...
-
特定の名前のオートシェイプの...
-
Functionで戻り値を複数返す方法
-
特定のファイルを他のプロセス...
-
エクセルVBAでロックをかけたい
-
フォルダのアクセス権確認について
-
VBA 複数の行を高速で削除する...
-
iPhoneのニューラルエンジンっ...
-
¥マークを含むパスの処理につ...
-
For ~ Next文
-
IF文に時間(何時から何時ま...
-
ドリブン??
-
UWSCでの例外処理について
-
UWSCのTHREADについて
-
フォーカスがどこか行ってしまう
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【C#/Java?】try-catchでcatch...
-
vbaのエラー対応(実行時エラー...
-
シグナル 6(SIGABRT)とは?
-
どう増強すべきか
-
private subモジュールを他のモ...
-
IF文に時間(何時から何時ま...
-
特定の名前のオートシェイプの...
-
Excel VBA セルの名前があるか...
-
マクロで、次のコードへ行く前...
-
ExcelのVBAで、選択したファイ...
-
特定のファイルを他のプロセス...
-
VB6にてネットワーク上にある共...
-
どうやってもFor文を抜けてしま...
-
Word VBA。各マクロの間に待ち...
-
エクセル VBAで複数セル選択時...
-
【VBA】エラー処理で別プロシー...
-
フォルダのアクセス権確認について
-
VBA For Each 〜 複数条件について
-
StatusStripの表示が更新されな...
-
【C#】Page_Loadさせない方法に...
おすすめ情報