如果一個析構函數在由異常引起的堆棧展開期間拋出C++,程序將終止。 (這就是爲什麼析構函數不應該用C扔++。)例:拋出一個新的異常拋出一箇舊的異常
struct Foo
{
~Foo()
{
throw 2; // whoops, already throwing 1 at this point, let's terminate!
}
};
int main()
{
Foo foo;
throw 1;
}
terminate called after throwing an instance of 'int'
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
如果finally塊被輸入在Java中,因爲在相應try塊的異常,並且finally塊拋出了第二個例外,第一個例外是默默吞下。例如:
public static void foo() throws Exception
{
try
{
throw new Exception("first");
}
finally
{
throw new Exception("second");
}
}
public static void main(String[] args)
{
try
{
foo();
}
catch (Exception e)
{
System.out.println(e.getMessage()); // prints "second"
}
}
這個問題在我腦海中浮現:編程語言是否可以處理同時拋出多個異常?這會有用嗎?你有沒有錯過這個能力?有沒有一種語言已經支持這個?有沒有這種方法的經驗?
有什麼想法?
你剛剛讓我的大腦拋出異常 – 2010-04-26 20:51:01
有趣的問題。我通過「處理異常」來假設你明確地意思是「由於異常導致堆棧展開」,而不是「從catch塊執行代碼」。後者我會稱之爲「處理異常」,但是由於處理程序已經定位,所以可以從那裏拋出一個異常(至少在C++中)。 – 2010-04-26 20:57:22
@尼克你是對的,我編輯了標題。如果你知道更好的一個,隨時可以再次更改;-) – fredoverflow 2010-04-26 20:59:19