2010-08-17 5 views
3

Dire que j'ai une méthode comme ceci:Existe-t-il un moyen de savoir sur quelle ligne une exception a été lancée?

public void SaveData() 
{ 
    try 
    { 
     foreach (var somevar1 in list.SomeType1s) 
     { 
      CEData.SaveRow(sometype1) 
     }  
     foreach (var somevar2 in list.SomeType2s) 
     { 
      CEData.SaveRow(sometype2) 
     }  
     foreach (var somevar3 in list.SomeType3s) 
     { 
      CEData.SaveRow(sometype3) 
     }  
     foreach (var somevar4 in list.SomeType4s) 
     { 
      CEData.SaveRow(sometype4) 
     }  
     foreach (var somevar5 in list.SomeType5s) 
     { 
      CEData.SaveRow(sometype5) 
     }  
    } 
    catch (Exception e) 
    { 
    logger.DebugException("Rollback Occured with the following stack trace: \r\n" 
     + e.StackTrace, e); 
    Rollback(); 
    throw; 
    } 
} 

est-il un moyen de savoir dans la partie de capture quelle ligne je suis arrivé? Ma trace de pile dira simplement que c'était dans la méthode SaveData(), mais pas quelle ligne a échoué.

Je pourrais aller ajouter une connexion entre chaque ligne, mais je préfère ne pas (pour diverses raisons de code de débogage).

Donc, je pensais que je demanderais. Est-il possible de savoir quelle ligne était en cours d'exécution lorsque l'exception a été levée?


Plus d'info:

On dirait que les numéros de ligne doivent venir standard. La seule raison pour laquelle je vois que je ne les obtiens pas, c'est que je suis en train de développer Windows Mobile et Compact Framework. Alors peut-être qu'ils ne sont pas inclus dans le cadre compact? (Mon projet a « plein » défini pour la sortie Debug Info.)

+0

S'agit-il d'un problème de fonctionnement en cours de lancement ou de débogage ou de présence de symboles? Les traces de pile ont généralement des lignes pour moi, pour chaque image de la pile. Aussi, êtes-vous capable d'attacher un débogueur tout en re-proing ce problème? Si c'est le cas, et que vous utilisez MSVC, affichez simplement la fenêtre de pile d'appel et double-cliquez sur une image de pile plus haute ... –

+0

Si vos PDB ne sont pas déployés avec l'image, cela pourrait aussi être le problème. Au moins, dit une personne que je connais qui travaille sur un produit basé sur les FC. –

+0

L'erreur que j'essaie de retrouver ne se produit pas dans Visual Studio, mais je me suis moqué de cela et je n'ai pas de numéros de ligne. J'ai le debug complet allumé donc je ne peux que supposer que c'est une limitation du Compact Framework. – Vaccano

Répondre

1

Non, le Compact Framework ne donne pas cette information. Refactoriser le SaveData en méthodes privées pour chacune des boucles for, alors vous devriez au moins le réduire jusqu'à ce point (par le nom de la méthode ou le paramètre d'entrée).

6

Tenir compte cet extrait en utilisant la classe StackFrame dans System.Diagnostics:

using System.Diagnostics; 
.... 
catch (Exception ex) { 
    StackTrace st = new StackTrace(new StackFrame(true)); 
    StackFrame sf = st.GetFrame(0); 
    Console.WriteLine(" File: {0}", sf.GetFileName()); 
    Console.WriteLine(" Method: {0}", sf.GetMethod().Name); 
    Console.WriteLine(" Line Number: {0}", sf.GetFileLineNumber()); 
    Console.WriteLine(" Column Number: {0}", sf.GetFileColumnNumber()); 
} 

Pour Compact Framework spécifique, fait l'erreur .ToString() généré inclut le numéro de ligne ? Peut-être quelque chose comme:

catch(Exception ex) 
{string errDesc = ex.ToString();} 

Révélateur:

« System.Exception: foo \ r \ n à MyProf.Class.MyMethod (int foo) dans D: \ sourcecode \ somefile.cs: ligne 1234"

+0

Je ne pensais pas que cela aurait de l'importance, donc je n'ai pas tagué cette question avec un framework compact (initialement), mais mon projet est un projet de framework compact et les classes StackTrace et StackFrame ne sont pas supportées par le framework compact. :( – Vaccano

+0

@Vaccano: en effet, désolé d'entendre que StackTrace n'est pas dans le Compact Framework A part: quand vous attrapez l'exception, et inspectez 'ex.ToString()', contient-il le numéro de ligne à la fin avec ". .. line: 123 "? –

+0

Hélas n ° J'ai fait quelques recherches et il semble que les numéros de ligne ne sont pas supportés sur le framework compact.Je ne sais pas qui était l'idée. :( – Vaccano

2

Lorsque vous Intercepter l'exception, utilisez la méthode Exception.ToString(). Si vous avez des fichiers .pdb correspondants dans le même répertoire que votre exe/dll (ce que vous pouvez faire en sélectionnant la configuration de construction de débogage), la sortie inclura automatiquement les numéros de ligne.

Questions connexes