11

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


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

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

編集:私の質問は、finallyがいつ実行されるかについてではなく、例外がまだ上向きにスローされるかどうかについてですが、それは今答えられています。

4

4 に答える 4

18

あなたfinallyが言うように、コードは常に実行され、例外が渡されます。これがポイントですtry/finally。例外がスローされた場合でも常に実行されるコードを用意することです。

編集:これは、構成を提供するすべての言語に当てはまりますがtry/finally、Adamがコメントで指摘し、Samが回答で指摘しているように、一部の言語には注意が必要です。

于 2009-07-06T23:06:55.213 に答える
9

これは、例外がスローされたかどうかに関係なく、(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;
        }
    }
}
于 2009-07-06T23:19:07.013 に答える
3

これがC#であると仮定すると、 StackOverflowExceptionまたはExecutingEngineExceptionが発生しない限り、finallyは常に実行されます。

さらに、ThreadAbortExceptionのような非同期例外は、finallyブロックのフローを中断して、部分的に実行する可能性があります。

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

C#では、Finallyブロックは、未処理の例外がスローされた場合、try、catchで実行されますか?

于 2009-07-06T23:36:08.963 に答える
2

これがC#の場合

ここでの答えは正しいです。finallyが実行され、例外は「渡され」ます。しかし、それを理解するのがいかに簡単かを説明するために:

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ブロックが実行されます。

于 2009-07-07T00:32:08.410 に答える