• 締切済み

finally ってどのようなときにつかうんですか?

処理A try 処理B catch 処理C finally 処理D ---------------------- 処理A try 処理B catch 処理C 処理D ---------------------- 以上2種類 どのみち 処理Dはとおりますよね? いったいどのような場合使うのでしょうか? 言葉で書くのが難しいのならソースでも構いません・・。 (言語はできたら VBかC#)

みんなの回答

  • bikkuri
  • ベストアンサー率33% (23/68)
回答No.3

2種類の処理で、例外発生時の処理の順序は以下のようになるはずです。 1つ目の例  処理A→処理B→例外発生→処理D→処理C 2つ目の例  処理A→処理B→例外発生→処理C→処理D 処理Dは正常時も例外時も実行されますが、処理Dの後は正常時と例外時で普通は違うことをする必要があるはずです。(例外時はエラーを表示してreturnとか) その場合、2つ目の例では、処理Dの後に例外があったかどうかを自分で再度判定する必要がありますが、1つ目の例ではその処理を単純に処理Cで行えます。 正常時でも異常時でも単にreturnして終わりの様な関数ならたいした違いはないかもしれません。

  • UKY
  • ベストアンサー率50% (604/1207)
回答No.2

基本的には、finallyには例外が発生しようがしまいが必ず実行するコードを書きます。なぜ単純に try-catch の後ろにコードを書くだけではいけないか、次の二つの例を比べてみてください。"Finish"という文字列が出力されるのはどちらでしょうか? 例1 try { throw new SystemException(); } catch (ApplicationException) { Console.WriteLine("Error"); } finally { Console.WriteLine("Finish"); } 例2 try { throw new SystemException(); } catch (ApplicationException) { Console.WriteLine("Error"); } Console.WriteLine("Finish"); (SystemException は catch (ApplicationException) ではキャッチできません。)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

finallyには、tryで実行された部分の後処理などを書きます。 例えばエラーが起こったために、ファイルのクローズがされていないような流れになるような場合にクローズ処理をするとか作りかけとか途中まで作った物の整合性をとるとかそういうことをします。 この処理は、tryの中で処理される(された)処理と関係があるので、単純に処理Dでいつも実行すればよいというものではありません。(もちろん、いつも処理Dを実行すればいいという場合もあります)

関連するQ&A

  • 【C#/Java?】try-catchでcatchせずにfinallyは一般的?

    普段はJavaを使っているのですが、故あってC#のソースを簡易レビューすることになりました。 C#を始めてそれほど間もない人間の書いたソースなのですが、以下のようなソースをたびたびみかけます。 try {   // 処理 } finally {   // finally処理 } C#の場合、Javaとは異なり全ての例外はJavaで言うところの非チェック例外であると認識しています。(ただし、Javaの非チェック例外と同じ扱いをしていいとは思っていませんが……) 呼び出し元に起きうる全ての例外処理を任せるがfinally処理をしたいならば、このような書き方をするのが一般的なのでしょうか。 Javaの場合でもこのような書き方ができることは確認しましたが、Javaの場合は非チェック例外が起きる=バグであることがほとんどなので、このような書き方をする場面はあまりないように思います。 (もちろんチェック例外もthrowsを書けば同じように書くこともできるとは思いますが、自分ならやらないですし、そのようなソースを見たこともないです) ですので、単に自分がJavaを普段使っているからcatchがないことに違和感を感じるだけなのであれば、この問題はスルーしたいと思います。 C#経験者が周りにいない状況ですので、皆様のお知恵をおかりしたいと思います。よろしくお願いします。

  • try catch finally は必要か???

    smtpでメールを同期送信しております もちろん通常とおり前後をtry catch finally で囲んでおります 送信に時間が掛るので、今回非同期送信に改めました それに伴いイベントハンドラーも追加しました するとエラーが発生してもcatchには来ずイベントハンドラーのエラー発生の判定部分に来ます 質問? イベントハンドラーを設置した場合、try catch finallyは取り外しても良いのでしょうか?

  • SKE48の片想いFinallyについて

    SKEさんの片想いFinallyを買おうと思っています。 TYPE-A、B、Cの中から一枚選ぶとしたら どれが良いでしょうか?

  • Try~Catch、Finallyについて。

    下記のように、DataSetをXML出力するメソッドを作りました。 Public Sub WriteXml(ByVal xmlDs As DataSet) Try Dim fileStream As New System.IO.FileStream(holdFilePath, System.IO.FileMode.Create) Dim setting As New System.Xml.XmlWriterSettings '文字コード設定 With setting .Encoding = System.Text.Encoding.UTF8 .Indent = True End With Dim writer As System.Xml.XmlWriter = Xml.XmlWriter.Create(fileStream, setting) 'XMLへの書き込みを行い、FileStreamを閉じる xmlDs.WriteXml(writer) writer.Close() fileStream.Close() Catch ex As Exception MsgBox(ex.message) End Try End Sub メソッドは以上です。 writer.Close()、fileStream.Close()については、確実に 処理を行いたいので、Finallyで行おうかと思ったのですが、 その場合、Dim fileStream~、Dim writer~はTryの外に出さないと、 宣言されていないと言われてしまいます。 そうなると今度は、NewやXml.XmlWriter.Create(fileStream, setting) でコケた場合にCatchが出来ません…。 Usingを使うのが近いかなと思ったんですが、複数Newしている場合 でも使えるのでしょうか? 確実にClose処理を行うための改修箇所、アドバイスいただけ ないでしょうか? よろしくお願いします。

  • try catchについて

    try catchの動きで質問があります。 以下が簡略化したソースです。 -------ここから--------------------- ストリーム1; ストリーム2; try{ try{ //ストリーム1を使った処理 }catch(IOException e){ throw e; }finally{ //ストリーム1のクローズ } try{ //ストリーム2を使った処理 }finally{ //ストリーム2のクローズ } } catch(IOException e){ throw new hogeException(); } ------ここまで-------------------------- 内側でスローされた例外は、外側でcatchされるのですか? また、内側でcatchをしなかった場合、外側でcatchされるのですか? この2点を教えていただきたいです。 よろしくお願いします。

    • ベストアンサー
    • Java
  • DBのコネクションのclose処理で例外が発生した場合

    DBのコネクションのclose処理で例外が発生した場合 DBアクセスが終わった後、finallyでResultSetやConnection、PreparedStatementのclose処理を行うと思います。 } finally { if (result != null) { try { result.close(); } catch (SQLException e) { } } if (ps != null) { try { ps.close(); } catch (SQLException e) { } } if (conn != null) { try { conn.close(); } catch (SQLException e) { } } } 上記では各close処理で例外が発生した場合、何もしていませんがこのあたりの処理は何を行うべきなのでしょうか。 例えばログ出力をして例外をそのまま上位にスローするなどでしょうか。 close処理で例外が発生するのは余程のことだと思うのですが、ログ出力以外で何かやるべき処理はありますでしょうか。

    • ベストアンサー
    • Java
  • 分岐処理(アルゴリズム)

    C言語の初心者です。 C言語の分岐処理の書き方(アルゴリズム)について 分からない事があり質問しました。 A、B、C、Dという変数があり、 この変数にはランダムに、ある浮動小数が代入されます。 A、B、C、Dの値を比較して、 (1)一番小さい値が存在する場合 (2)一番小さい値が2つ存在する場合 (3)上記以外の場合 といったように場合分けを行い、 (1)一番小さい値をディスプレイに表示。 (2)アルファベット順で早い方  (Ex. AとBならA、但しDとAの場合はD)  をディスプレイに表示。 (3)Aをディスプレイに表示。 といったように、場合分けによってそれぞれ 処理を行いたいのです。 条件を&&や||で増やせばできると思うのですが、 端的に書くにはどうしたらよいか悩んでいます。 よろしくお願いします。

  • PHP5の例外処理について。

    PHP5からtry, catchが実装されたのですが、以下の点がわからないです。 他の言語のような、finallyはないのでしょうか? (正常でも異常でも必ず実行する箇所のことです。) 可能であれば、サンプルを提示していただけるとありがたいです。 ご回答、よろしくお願いします。

    • ベストアンサー
    • PHP
  • テキストファイルからの読み込みについて

    またまた困っております。 下記の様な場合はどうなるのでしょうか? class Test{ public Static void main(String[] args){   ・  ・ try{ 処理内容A    処理内容B 処理内容C    処理内容D  }catch{ メソッドの呼び出し }   ・   ・   ・ } ------------------------ class Error{ 処理内容Aのcatch定義    処理内容Bのcatch定義 処理内容Cのcatch定義    処理内容Dのcatch定義 } -------------------------- Error.txt 処理内容Aのエラーメッセージ 処理内容Bのエラーメッセージ 処理内容Cのエラーメッセージ 処理内容Dのエラーメッセージ ------------------------------ のように、Testクラス内の処理を別のクラスで行い(Testクラスではその処理のメソッドを呼び出す)、例外内容に付いてもErrorクラスで定義し、エラーの表示内容をError.txtの様な外部ファイルに格納しておいた時に、 Testクラス内で「処理内容B」でエラーが発生した場合、Errorクラスで対応したエラー(処理内容Bのcatch定義)処理を行うのですが、Error.txtから「処理内容Bのエラーメッセージ」を拾い出してくるにはどうしたらよいのですか? 長くなり分かり難いかもしれませんが、宜しくお願い致します。

    • ベストアンサー
    • Java
  • 必要なソースコードのみを抽出

    数百MBに及ぶソースコードがあります。モジュールAのみを使う時、AがBを依存しています、BがCを依存しています、Cは・・・となり、結局全部コンパイルする羽目になります。 実際のところ、AはBの1関数のみ利用しており、Bのその他無関係の関数がCを依存しています。 モジュールAをうまく抜き出す方法はありませんか。言語はC、C#、VB、各言語単位で出来れば十分です。。

専門家に質問してみよう