Reprendre l'exécution de code après l'exception est levée et a pris
Comment est-il possible de reprendre l'exécution de code après une exception est levée?
Prenez, par exemple, le code suivant:
namespace ConsoleApplication1
{
public class Test
{
public void s()
{
throw new NotSupportedException();
string @class = "" ;
Console.WriteLine(@class);
Console.ReadLine();
}
}
public class Program
{
public static void Main(string[] args)
{
try
{
new Test().s();
}
catch (ArgumentException x)
{
}
catch (Exception ex)
{
}
}
}
}
Après la capture de l'exception lors de l'exécution pas à pas, le programme s'arrête en cours d'exécution. Comment puis-je continuer à exécution?
EDIT: Ce que j'ai particulièrement veux dire, c'est la ligne de la Console.WriteLine(@classe), ne semble pas être frappé, parce que quand je lance quand en mode de débogage, le programme sort de mode de débogage. Je veux courir vers cette ligne et de s'arrêter à ça.
Grâce
- basé sur le code ci-dessus si l'exception est levée, le bloc catch approprié va l'intercepter. Toute déclaration qui vient après le bloc catch sera exécuté!!!
- Il semble que vous voulez de C#version de BASE du
ON ERROR RESUME NEXT
.
Vous devez vous connecter pour publier un commentaire.
Bien, vous n'avez pas de code d'après le
catch
blocs, de sorte que le programme serait d'arrêter de courir. Pas sûr de ce que vous essayez de faire.La suivante devrait être la preuve que le programme n'est pas simplement "stop" après la
catch
blocs. Il va exécuter du code après lacatch
blocs si il y a un code à exécuter:Le code affichera la chaîne appropriée en fonction de l'exception qui a été attrapé. Puis, il va imprimer
I am some code that's running after the exception!
à la fin.Mise à JOUR
Dans votre montage vous demandé pourquoi
Console.WriteLine(@class);
ne semble pas être touché. La raison en est que vous êtes explicitement lancer une exception dans la première ligne de votres()
méthode; tout ce qui suit est ignoré. Lorsqu'une exception est détectée, l'exécution s'arrête et l'exception est propagée haut de la pile des appels jusqu'à ce que le gestionnaire approprié peut le manipuler (ce qui peut être uncatch
bloc qui correspond à latry
qui encapsule la requête en question au sein de la même méthode, ou il peut être uncatch
bloc le plus haut dans la pile des appels. Si aucun gestionnaire approprié est trouvé, le programme va se terminer avec une stacktrace [au moins en Java ne sais pas si la même chose se passe en C#]).Si vous voulez frapper la
Console.WriteLine
ligne, alors vous ne devriez pas être explicitement la levée d'une exception au début de la méthode.Il semble que vous êtes désireux resumeable exceptions. C# ne pas faire resumeable exceptions, et je doute que CLR les prend en charge.
Le but de lancer une exception est à faire avorter une fonction et un ensemble de l'opération (pile) si/quand quelque chose dans l'appel de l'environnement (paramètres, état de l'objet, de l'état global) rend la fonction de l'opération impossible ou non valide. Le passage d'un zéro paramètre à une fonction qui doit diviser la quantité par ce param, par exemple. La Division par zéro ne sera pas produire un résultat significatif, et si c'est le seul but de la fonction, la fonction ne peut pas retourner un résultat significatif, soit. Donc, lancer une exception. Cela va entraîner l'exécution de sauter le plus proche de capture ou de bloc finally sur la pile d'appel. Il n'y a pas de retour de la fonction qui a déclenché l'exception.
Si vous voulez pas dans votre code dans le débogueur la trace de la Console.WriteLine() appelle, vous devez supprimer le lancer de nouveaux NotSupportedException() de la ligne à partir de votre code et de le recompiler.
Si vous êtes inquiet que une exception sera levée dans la méthode, mais vous voulez la méthode pour continuer, ajouter un gestionnaire d'erreurs à l'intérieur de la méthode.
Vous pouvez également retourner un booléen ou une autre valeur pour indiquer l'état.
Avertissement: je ne suggère pas que vous avez réellement le faire.
Vous pouvez imiter le vieux VB style on Error Resume Next avec le code suivant.
Et alors il pourrait être utilisé comme suit.
Un code simple j'ai mis en place pour attraper les exceptions qui sont jetés à l'intérieur d'un bloc catch:
L'exécution est encore portant sur mais il n'y a pas de code après l'exception est interceptée. Si vous souhaitez appeler à plusieurs reprises alors il est recommandé de mettre le bloc try/catch dans une boucle while.
Le programme s'arrête parce qu'il n'y est pas de suite à l'exécution de code dans la méthode main ()! Vous pouvez ajouter la ligne suivante à votre code de garder le programme en cours d'exécution jusqu'à ce qu'il y a une entrée de la console:
Pour ce code, vous ne pouvez pas. Si vous enfreignez les tâches jusqu'à de plus petits morceaux, vous pouvez reprendre la partie suivante. Mais normalement, il est plus facile d'avoir un autre mécanisme d'exceptions pour signaler des erreurs non fatales, comme une fonction de rappel qui renvoie à savoir si ou de ne pas poursuivre.
Vous pouvez utiliser les "plus" de la fonctionnalité de débogage pour atteindre cet par exécuter base.