Perché la parte alta dello stack (in Exception.StackTrace) viene troncata? Vediamo un semplice esempio:Perché lo stack viene troncato in Exception.StackTrace?
public void ExternalMethod()
{
InternalMethod();
}
public void InternalMethod()
{
try
{
throw new Exception();
}
catch(Exception ex)
{
// ex.StackTrace here doesn't contain ExternalMethod()!
}
}
Sembra che questo è "by design". Ma quali sono le ragioni di un disegno così strano? Rende il debug più complesso, perché nei messaggi di log non riesco a capire chi ha chiamato InternalMethod() e spesso questa informazione è molto necessaria.
Per quanto riguarda le soluzioni (per coloro che non sanno), ci sono 2 soluzioni generali a quanto ho capito:
1) Siamo in grado di accedere proprietà Environment.StackTrace statica, che contiene l'intero stack (per esempio, a partire da il livello più alto (coda messaggi) e termina con il metodo più profondo in cui si verifica l'eccezione).
2) Dobbiamo catturare e registrare le eccezioni ai livelli più alti. Quando dobbiamo catturare le eccezioni a livelli più bassi per fare qualcosa, abbiamo bisogno di rilanciare (con l'istruzione "lancia" in C#) più avanti.
Ma la domanda riguarda le ragioni di tale progettazione.
Perché un oggetto dovrebbe interessarsi a chi lo ha chiamato? Il tuo punto (2), nel senso che l'eccezione dovrebbe essere rigettata, è l'approccio corretto. –
Principalmente le informazioni di tracciamento dello stack sono incluse con eccezione a scopo di debug. Con il design esistente non aiuta a fare il debug come se lo fosse se avesse anche una parte più alta dello stack. Perché, ripeto, sapere chi ha chiamato il metodo può essere molto utile per il debug. – nightcoder