2009-07-06 12 views
9

何が起こっても特定のコードが実行されるような状況がありますが、後で処理するためにスタックに渡すために例外が必要です。次のようになります:最後に例外を無視しようとしますか?


try 
{ 
    // code 
} 
finally 
{ 
    // code that must run 
} 

例外を無視するか、それを上書きしますか?私のテストでは、彼らはまだ上に渡されることを示すようだが、私は狂っていないことを確認したい。

EDIT:私の質問は、最終的にいつ実行されるかについてではなく、例外が依然として上向きにスローされるかどうかについてですが、今答えられています。

+0

これは、http://stackoverflow.com/questions/547791/why-use-finally-in-cにかなり近いです。 –

+2

これはどの言語/プラットフォームですか? JavaまたはC#? –

+1

これについてはかなり良い毎日があります:http://thedailywtf.com/Articles/My-Tales.aspx –

答えて

7

ここには例外がスローされたかどうかに関係なく、(1)が最終的に実行されることを示すテストクラスがあります。 (2)例外は呼び出し元に渡されます。

public class FinallyTest extends TestCase { 
    private boolean finallyWasRun = false; 

    public void testFinallyRunsInNormalCase() throws Exception { 
     assertFalse(finallyWasRun); 
     f(false); 
     assertTrue(finallyWasRun); 
    } 

    public void testFinallyRunsAndForwardsException() throws Exception { 
     assertFalse(finallyWasRun); 
     try { 
      f(true); 
      fail("expected an exception"); 
     } catch (Exception e) { 
      assertTrue(finallyWasRun); 
     } 
    } 

    private void f(boolean withException) throws Exception { 
     try { 
      if (withException) 
       throw new Exception(""); 
     } finally { 
      finallyWasRun = true; 
     } 
    } 
} 
16

finallyコードは常に実行され、あなたが言うように、例外は上書きされます。 try/finallyの要点です。例外がスローされたときでも、常に実行されるいくつかのコードがあります。

編集:これはtry/finally構築物を提供する任意の言語についても同様ですが、アダムは彼のコメントで指摘し、サムは彼の答えで指摘するように、いくつかの言語のための注意事項が、あります。

+0

これは本当に本当です、関連の答えを参照してください –

+0

私はリッチーが正しい; try/finallyでは、tryブロック内のコードが実行され、例外がスローされたかどうかにかかわらず、finallyブロック内のコードがその後に実行されます。 – snake

+0

@ snake、私の答えと関連する回答を参照してください。最終的にはC#が実行されない場合があります。 –

3

これは、C#であると仮定すると、あなたがStackOverflowExceptionExecutingEngineException

を取得しない限り、最終的には必ず実行されますまた、ThreadAbortExceptionのような非同期の例外は最終的にそれが部分的に実行させるブロックの流れを中断することができます。

関連の質問を参照してください:

In C# will the Finally block be executed in a try, catch, finally if an unhandled exception is thrown?

2

これは、C#の場合:

ここでの答えは最後に実行され、例外は "渡される"、右です。しかし、それはそれを把握することがいかに簡単であるかを示すために:この単純な、小さなコンソールアプリケーションを実行する場合

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     try 
     { 
      throw new Exception("testing"); 
     } 
     finally 
     { 
      Console.WriteLine("Finally"); 
     } 
    } 
} 

を、例外がスローされ、その後、finallyブロックが実行されます。

関連する問題