Comment obtenir de l'erreur numéro de ligne de code à l'aide de try-catch
Je veux obtenir le numéro de ligne de code qui génère l'erreur. Par exemple;
static void Main(string[] args)
{
using (SqlConnection conn = new SqlConnection(bagcum))
{
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "DONTINSERT into GIVEMEERROR(CamNo,Statu) values (" + 23 + "," + 0 + ")";
conn.Open();
int n = cmd.ExecuteNonQuery();
}
}
de sorte Que nous savons que le code ne fonctionne pas, il va jeter l'exception du numéro de Ligne de code qui est:
int n = cmd.ExecuteNonQuery();
Alors, comment pouvez obtenir le numéro de ligne de l'aide try-catch
? J'ai essayé d'utiliser un StackTrace
classe, mais il donne le numéro de ligne que 0:
static void Main(string[] args)
{
try
{
using (SqlConnection conn = new SqlConnection(bagcum))
{
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "DONTINSERT into GIVEMEERROR(CamNo,Statu) values (" + 23 + "," + 0 + ")";
conn.Open();
int n = cmd.ExecuteNonQuery();
}
}
catch (Exception ex)
{
System.Diagnostics.StackTrace trace = new System.Diagnostics.StackTrace(ex, true);
Console.WriteLine("Line: " + trace.GetFrame(0).GetFileLineNumber());
}
}
De SORTIE:
Line:0
Mise à jour:
Généralement l'erreur de la ligne de code est de 22 donc, je dois obtenir ce nombre.
Grâce
- Si vous êtes dans
RELEASE
mode, le numéro de la ligne (entre autres) n'est plus dans la stacktrace. La manière la plus facile de compiler dansDEBUG
mode. Si cela ne fonctionne toujours pas, vérifiez si vous avez plein les informations de Débogage dans les propriétés du projet\Advanced\Debug Info. - il est en mode Debug, et il s full Debug
- Sont votre .pdb fichiers dans le même répertoire que les autres fichiers?
- oui, il y a
Vous devez vous connecter pour publier un commentaire.
Essayez ce simple hack plutôt:
D'abord Ajouter ce (extension) de la classe de votre espace de noms(plus de niveau supérieur classe):
Et de son fait!Utilisation LineNumber méthode à chaque fois que vous en avez besoin:
essayer cette
Pour obtenir les numéros de ligne dans la StackTrace, vous devez avoir la bonne information de débogage (fichiers PDB) à côté de votre dll/exe. Pour la générer les informations de débogage, définissez l'option dans
Project Properties -> Build -> Advanced -> Debug Info
:Le paramètre
full
devrait suffire (voir la MSDN docs pour ce que les autres options ne). Les informations de débogage (ie. Fichiers PDB) sont générées pour la version Debug configurations par défaut, mais peuvent également être générés pour la Libération de construire des configurations.Générer Pdb pour les versions release vous permet de vous expédier le code sans le Pdb, mais à la chute de la Pdb en regard de la dll si vous avez besoin des numéros de ligne (ou même d'attacher un débogueur distant). Une chose à noter est que, dans un communiqué de construire, les numéros de ligne ne peut pas être tout à fait exacte en raison des optimisations faites par le compilateur ou le compilateur JIT (c'est notamment le cas de la ligne de numéros de montrer que 0).
Le problème, c'est que vous essayez d'obtenir le numéro de ligne de la première image de l'exception:
Toutefois, l'exception ne pas proviennent de la ligne pour écrire
ExecuteNonQuery
, mais quelque part à l'intérieur de cette fonction, peut-être plusieurs stack frames (c'est à dire les appels de fonctions imbriquées) de plus. Donc, la première image qui vous explicitement extraire à l'aide d'GetFrame(0)
) est quelque part à l'intérieur de Microsoft du code (le plus probableSystem.Data.dll
) pour lequel vous n'avez pas les symboles de débogage.Écrire l'exception stacktrace dans votre fonction pour voir ce que je veux dire:
Court de l'analyse de la stacktrace (ex.StackTrace) n'est pas fiable pourquoi pour obtenir le linenumber de la "ExecuteNonQuery()" l'invocation. Je voudrais surtout pas essayez de compter les structures de pile la pile où votre appel à la méthode ExecuteNonQuery() se produit.
Je me demande bien, ce que vous avez besoin de la seule linenumber pour, pourquoi ne pas simplement enregistrer/imprimer/quelle que soit la complète stacktrace à la place. Au moins pour le diagnostic des raisons qui est beaucoup plus utile de toute façon.
Vous pourriez obtenir 0 en conséquence, si vous n'avez pas initialiser StackTrace inclure fileinfo.
Essayer cette
Cela a fonctionné pour moi.
Vous pouvez utiliser le Système.Diagnostics.StackTrace classe comme ci-dessous:
Ici est plutôt moyen facile d'obtenir un tas d'informations à partir de l'objet de l'Exception: il suffit d'ajouter ce code à tout potentiellement exception des jets de méthodes:
Les informations que vous obtiendrez souvent être plus précis, en particulier en ce qui concerne les numéros de ligne de où les problèmes se produisent, que vous auriez autrement voir.
Vous avez peut-être noté que la Chaîne.Format() utilise une constante, à savoir "ExceptionFormatString". C'est une bonne pratique, de sorte que si vous voulez le modifier, après l'ajout du code ci-dessus à 40-onze méthodes, vous pouvez simplement changer un seul endroit. De toute façon, ici, il est:
Heureux De Débogage!
Pour obtenir les numéros de ligne, vous avez besoin de votre application en mode Debug ou inclure les symboles de débogage dans le même dossier (le .fichier pdb) pour les numéros de ligne à apparaître. Vous code affiché doit alors travailler.
le code suivant exception du journal de gestionnaire méthode fonctionne très bien :
dans attraper :
dans AddToLog méthode :
Enfin, le journal xml fichier ressemble à ceci :
Dans .NET 4.5, vous pouvez utiliser le ExceptionDispatchInfo renvoyer vos exceptions au lieu de la classique
throw;
(assurez-vous que les fichiers PDB sont là ou pas de numéro de ligne sera affiché):Source: article sur le blog.
Fichiers PDB ne pas diminuer les performances sur Windows.
Copie toute trace de la pile à une chaîne ou un stringbuilder par l'utilisation de try/catch qui peut jeter, voir l'exemple ci-dessous
La sortie sera
La première ligne indique le type de l'exception et le message. La deuxième ligne indique le fichier, la fonction et le numéro de ligne où l'exception a été levée