Registrieren Sie das Ereignis AppDomain.FirstChanceException.
Dort erhalten Sie alle Ausnahmen, bevor die tatsächlich geworfen werden. Im Event-Handler können Sie nach Ihrem exception
suchen und die erforderliche Protokollierung durchführen.
Keine Magie und kein schlechtes Design.
class Program
{
static void Main(string[] args)
{
AppDomain.CurrentDomain.FirstChanceException += CurrentDomain_FirstChanceException;
DoBadThings();
}
private static void DoBadThings()
{
DoOneLevelBelow();
}
private static void DoOneLevelBelow()
{
for(int i=0;i<10;i++)
{
try
{
if (i == 5)
{
var invalidCast = (string)((object)i);
}
else
{
throw new InvalidTimeZoneException();
}
}
catch
{
}
}
}
static void CurrentDomain_FirstChanceException(object sender, System.Runtime.ExceptionServices.FirstChanceExceptionEventArgs e)
{
if(e.Exception is InvalidCastException)
{
LogInvalidCast((InvalidCastException)e.Exception);
}
}
private static void LogInvalidCast(InvalidCastException invalidCastException)
{
Console.WriteLine("Got Invalid cast: {0}", invalidCastException);
}
Diese führen wird:
Got ungültig Besetzung: System.InvalidCastException:
Das Objekt vom Typ "System.Int32"
kann nicht konvertiert werden, um "System.String". bei ThrowTest.Program.DoOneLevelBelow()
in d: \ Media \ Blog \ ThrowTest \ Program.cs: Linie 31.
Bitte beachten Sie, da Sie die Ausnahme erhalten, bevor der Stapel abgewickelt wird Sie nur die Methode sehen, wo es geschah aber nicht die Aufrufmethoden, da der Stapel noch nicht abgewickelt wurde. Wenn Sie den kompletten Call-Stack haben möchten, können Sie Environment.StackTrace
verwenden, um alle Stack-Frames zu erhalten.
Was nutzt es? –
Schlüsselwörter sind weder übersteuerbar noch überladbar. –
Auch wenn Sie throw überschreiben könnten, könnten Sie ein unerwartetes Ergebnis der zugrunde liegenden Bibliotheken sehen. :) – eandersson