Se un distruttore getta in C++ durante lo srotolamento dello stack causato da un'eccezione, il programma termina. (Ecco perché distruttori non dovrebbero mai gettare in C++.) Esempio:Lancio di una nuova eccezione durante il lancio di una vecchia eccezione
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.
Se viene inserito un blocco finally in Java a causa di un'eccezione nel blocco try corrispondente e che finalmente blocco lancia una seconda eccezione, la prima eccezione è inghiottito silenziosamente. Esempio:
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"
}
}
Questa domanda mi attraversò la mente: in grado di gestire un linguaggio di programmazione più eccezioni gettati allo stesso tempo? Sarebbe utile? Hai mai perso quell'abilità? C'è un linguaggio che già supporta questo? C'è qualche esperienza con un simile approccio?
Qualche idea?
Hai appena fatto il mio cervello lanciare un'eccezione –
Interessante domanda. Presumo che "gestendo un'eccezione" si intenda specificamente "stack unwinding a causa di un'eccezione", non "esecuzione di codice da un blocco catch". Quest'ultimo chiamerei "gestire un'eccezione", ma dal momento che un gestore è stato localizzato, è possibile generare un'eccezione da lì (almeno in C++). –
@Nick Hai ragione, ho modificato il titolo.Se ne conosci uno migliore, sentiti libero di cambiarlo di nuovo ;-) – fredoverflow