Dieses Problem kann teilweise umgangen werden. Der Ausnahmecode des Frameworks lädt die Fehlermeldungen aus seinen Ressourcen, basierend auf dem aktuellen Gebietsschema des Threads. Bei einigen Ausnahmen geschieht dies zum Zeitpunkt des Zugriffs auf die Eigenschaft Message.
In diesen Ausnahmefällen können Sie die vollständige US-englische Version der Nachricht erhalten, indem Sie das Gebietsschema des Threads während der Protokollierung kurz auf en-US umstellen (speichern Sie das ursprüngliche Benutzergebietsschema vorher und stellen Sie es unmittelbar danach wieder her).
Noch besser ist es, dies in einem separaten Thread zu tun: So wird sichergestellt, dass es keine Nebenwirkungen gibt. Zum Beispiel:
try
{
System.IO.StreamReader sr=new System.IO.StreamReader(@"c:\does-not-exist");
}
catch(Exception ex)
{
Console.WriteLine(ex.ToString()); //Will display localized message
ExceptionLogger el = new ExceptionLogger(ex);
System.Threading.Thread t = new System.Threading.Thread(el.DoLog);
t.CurrentUICulture = new System.Globalization.CultureInfo("en-US");
t.Start();
}
Die Klasse ExceptionLogger sieht in etwa so aus:
class ExceptionLogger
{
Exception _ex;
public ExceptionLogger(Exception ex)
{
_ex = ex;
}
public void DoLog()
{
Console.WriteLine(_ex.ToString()); //Will display en-US message
}
}
Da jedoch Joe weist in einem Kommentar zu einer früheren Version dieser Antwort korrekterweise darauf hin, dass einige Meldungen zum Zeitpunkt des Auftretens der Ausnahme bereits (teilweise) aus den Sprachressourcen geladen sind.
Dies gilt für den Teil der Meldung "Parameter kann nicht null sein", der erzeugt wird, wenn z. B. eine ArgumentNullException("foo") ausgelöst wird. In diesen Fällen wird die Meldung immer noch (teilweise) lokalisiert angezeigt, selbst wenn der obige Code verwendet wird.
Außer durch die Verwendung von unpraktischen Hacks, wie z. B. alle Ihre Nicht-UI-Code auf einem Thread mit en-US locale zu beginnen, scheint es nicht viel Sie dagegen tun können: der .NET Framework-Ausnahmecode hat keine Möglichkeiten für die Fehlermeldung Gebietsschema überschreiben.