try {
// Do stuff
}
catch (Exception e) {
throw;
}
finally {
// Clean up
}
Dans le bloc ci-dessus, quand est appelé le dernier bloc? Avant le lancement de e ou est finalement appelé et puis attraper?
try {
// Do stuff
}
catch (Exception e) {
throw;
}
finally {
// Clean up
}
Dans le bloc ci-dessus, quand est appelé le dernier bloc? Avant le lancement de e ou est finalement appelé et puis attraper?
Pourquoi ne pas l'essayer:
outer try
inner try
inner catch
inner finally
outer catch
outer finally
avec code (formaté pour l'espace vertical):
static void Main() {
try {
Console.WriteLine("outer try");
DoIt();
} catch {
Console.WriteLine("outer catch");
// swallow
} finally {
Console.WriteLine("outer finally");
}
}
static void DoIt() {
try {
Console.WriteLine("inner try");
int i = 0;
Console.WriteLine(12 / i); // oops
} catch (Exception e) {
Console.WriteLine("inner catch");
throw e; // or "throw", or "throw anything"
} finally {
Console.WriteLine("inner finally");
}
}
Votre exemple se comporterait de la même manière que ce code:
try {
try {
// Do stuff
} catch(Exception e) {
throw e;
}
} finally {
// Clean up
}
En remarque, si vous voulez vraiment dire throw e;
(c’est-à-dire lancer la même exception que vous venez de prendre), il est bien mieux de ne faire que throw;
, car cela préservera l’original trace de pile au lieu d'en créer une nouvelle.
Lors du test avec une application console C #, le code finally a été exécuté après la levée de l'exception: le "dialogue d'erreur d'application" existait et, une fois l'option "Fermer le programme" sélectionnée, le bloc finally a été exécuté dans cette fenêtre de la console. Mais en définissant le point de rupture à l'intérieur du bloc de code finally, je ne peux jamais l'atteindre. Le débogueur continue de s’arrêter à l’instruction throw. Voici mon code de test:
class Program
{
static void Main(string[] args)
{
string msg;
Console.WriteLine(string.Format("GetRandomNuber returned: {0}{1}", GetRandomNumber(out msg), msg) == "" ? "" : "An error has occurred: " + msg);
}
static int GetRandomNumber(out string errorMessage)
{
int result = 0;
try
{
errorMessage = "";
int test = 0;
result = 3/test;
return result;
}
catch (Exception ex)
{
errorMessage = ex.Message;
throw ex;
}
finally
{
Console.WriteLine("finally block!");
}
}
}
Débogage dans VS2010 - .NET Framework 4.0
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.