Komunikaty WYJĄTKÓW w języku angielskim?
Rejestrujemy wszystkie wyjątki występujące w naszym systemie, pisząc wyjątek.Wiadomość do pliku. Są one jednak zapisane w kulturze klienta. A Tureckie błędy niewiele dla mnie znaczą.
Więc jak możemy rejestrować komunikaty o błędach w języku angielskim bez zmiany kultury użytkowników?
14 answers
Ten problem można częściowo obejść. Kod wyjątku Framework ładuje komunikaty o błędach ze swoich zasobów, w oparciu o aktualne ustawienia regionalne wątku. W przypadku niektórych wyjątków dzieje się to w momencie uzyskania dostępu do Właściwości Message.
W przypadku tych wyjątków, możesz uzyskać pełną angielską wersję wiadomości w USA, zmieniając na krótko ustawienia regionalne wątku na en-US podczas logowania (zapisując wcześniej oryginalne ustawienia regionalne użytkownika i przywracając je natychmiast później).
Robienie tego na osobnym wątku jest jeszcze lepsze: zapewnia to, że nie będzie żadnych skutków ubocznych. Na przykład:
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();
}
Gdzie Klasa ExceptionLogger wygląda mniej więcej tak:
class ExceptionLogger
{
Exception _ex;
public ExceptionLogger(Exception ex)
{
_ex = ex;
}
public void DoLog()
{
Console.WriteLine(_ex.ToString()); //Will display en-US message
}
}
Jednak, jak Joe słusznie zauważył w komentarzu do wcześniejszej wersji tej odpowiedzi, niektóre wiadomości są już (częściowo) ładowane z zasobów językowych w momencie wyrzucania wyjątku.
Dotyczy to części "parametr nie może być null" komunikat generowany na przykład podczas rzucania wyjątku ArgumentNullException ("foo"). W takich przypadkach wiadomość nadal będzie wyświetlana (częściowo) lokalnie, nawet przy użyciu powyższego kodu.
Inne niż używanie niepraktycznych hacków, takich jak uruchamianie całego kodu spoza interfejsu użytkownika w wątku z ustawieniami lokalnymi en-US, wydaje się, że niewiele możesz z tym zrobić: kod wyjątku.NET Framework nie ma możliwości nadpisywania ustawień regionalnych Komunikatu o błędzie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:33:26
Możesz wyszukać oryginalną wiadomość o wyjątku w unlocalize.com
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-28 22:00:31
Być może kwestia sporna, ale zamiast ustawiać kulturę na en-US
, możesz ustawić ją na Invariant
. W kulturze Invariant
komunikaty o błędach są w języku angielskim.
Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;
[[4]}ma tę zaletę, że nie wygląda stronniczo, szczególnie dla nieamerykańskich angielskojęzycznych lokalizacji. (a. k. a. unika złośliwych uwag kolegów)Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-08 19:05:29
Windows musi mieć zainstalowany język interfejsu użytkownika, którego chcesz użyć. Nie ma możliwości magicznego poznania tego, czym jest przetłumaczone przesłanie.
W en-US Windows 7 ultimate, z zainstalowanym pt-PT, następujący kod:
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("pt-PT");
string msg1 = new DirectoryNotFoundException().Message;
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US");
string msg2 = new FileNotFoundException().Message;
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fr-FR");
string msg3 = new FileNotFoundException().Message;
Tworzy komunikaty w pt-PT, en-US i en-US. Ponieważ nie ma zainstalowanych plików kultury francuskiej, domyślnie jest to domyślne windows(zainstalowany?) język.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-12 18:11:06
Oto rozwiązanie, które nie wymaga żadnego kodowania i działa nawet dla tekstów wyjątków, które są ładowane zbyt wcześnie, abyśmy mogli zmienić kod (na przykład te w mscorlib).
Może nie być zawsze stosowany w każdym przypadku (zależy to od konfiguracji, ponieważ musisz być w stanie utworzyć .plik konfiguracyjny obok głównego .plik exe) ale to mi działa. Więc po prostu utwórz app.config
w dev, (lub [myapp].exe.config
lub web.config
w produkcji), który zawiera następujące linie dla przykład:
<configuration>
...
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="mscorlib.resources" publicKeyToken="b77a5c561934e089" culture="fr" />
<bindingRedirect oldVersion="1.0.0.0-999.0.0.0" newVersion="999.0.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Xml.resources" publicKeyToken="b77a5c561934e089" culture="fr" />
<bindingRedirect oldVersion="1.0.0.0-999.0.0.0" newVersion="999.0.0.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
...
</configuration>
To nakazuje frameworkowi przekierowanie wiązań montażowych dla zasobów i systemu mscorlib.Zasoby Xml, dla wersji od 1 do 999, w języku francuskim (kultura jest ustawiona na "fr") do zbioru, który ... nie istnieje (dowolna wersja 999).
Więc kiedy CLR będzie szukać francuskich zasobów dla tych dwóch zespołów (mscorlib i System.xml), nie znajdzie ich i z wdziękiem powróci do języka angielskiego. W zależności od kontekstu i testów, można może być konieczne dodanie do tych przekierowań innych złożeń (złożeń zawierających zlokalizowane zasoby).
Oczywiście nie sądzę, że jest to obsługiwane przez Microsoft, więc używaj na własne ryzyko. Cóż, w przypadku wykrycia problemu, możesz po prostu usunąć tę konfigurację i sprawdzić, czy jest niezwiązana.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-01 08:20:08
Wiem, że to stary temat, ale myślę, że moje rozwiązanie może być dość istotne dla każdego, kto natknie się na niego w wyszukiwarce internetowej:
W exception loggerze można logować ex.GetType.ToString, który zapisuje nazwę klasy exception. Spodziewałbym się, że nazwa klasy powinna być niezależna od języka i dlatego zawsze będzie reprezentowana w języku angielskim (np. " System.FileNotFoundException"), choć obecnie nie mam dostępu do systemu obcojęzycznego, aby przetestować z pomysłem.
Jeśli naprawdę chcesz również tekst komunikatu o błędzie, możesz utworzyć słownik wszystkich możliwych nazw klas wyjątków i ich równoważnych wiadomości w dowolnym języku, który preferujesz, ale dla angielskiego myślę, że nazwa klasy jest całkowicie odpowiednia.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-26 15:17:02
Ustawienie Thread.CurrentThread.CurrentUICulture
zostanie użyte do zlokalizowania WYJĄTKÓW. Jeśli potrzebujesz dwóch rodzajów WYJĄTKÓW (jeden dla użytkownika, jeden dla ciebie), możesz użyć poniższej funkcji, aby przetłumaczyć wyjątek-wiadomość. Poszukuje w zasobach. Net-Libraries tekstu oryginalnego, aby uzyskać klucz zasobu, a następnie zwraca przetłumaczoną wartość. Ale jest jedna słabość nie znalazłem jeszcze dobrego rozwiązania: wiadomości, które zawierają {0} w zasobach nie zostaną znalezione. Gdyby ktoś miał dobre rozwiązanie to byłbym wdzięczna.
public static string TranslateExceptionMessage(Exception E, CultureInfo targetCulture)
{
try
{
Assembly a = E.GetType().Assembly;
ResourceManager rm = new ResourceManager(a.GetName().Name, a);
ResourceSet rsOriginal = rm.GetResourceSet(Thread.CurrentThread.CurrentUICulture, true, true);
ResourceSet rsTranslated = rm.GetResourceSet(targetCulture, true, true);
foreach (DictionaryEntry item in rsOriginal)
if (item.Value.ToString() == E.Message.ToString())
return rsTranslated.GetString(item.Key.ToString(), false); // success
}
catch { }
return E.Message; // failed (error or cause it's not intelligent enough to locale '{0}'-patterns
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-23 08:18:21
Wyobrażam sobie takie podejście:
1) wyjątki są zawsze odczytywane tylko przez Ciebie, tzn. nie są funkcją klienta, więc możesz używać nielokalnych ciągów, które nie ulegną zmianie podczas uruchamiania w trybie tureckim.
2) Dołącz kod błędu np. 0X00000001 z każdym błędem, dzięki czemu można go łatwo wyszukać w Angielskiej tabeli.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-16 16:04:11
CultureInfo oldCI = Thread.CurrentThread.CurrentCulture;
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture ("en-US");
Thread.CurrentThread.CurrentUICulture=new CultureInfo("en-US");
try
{
System.IO.StreamReader sr=new System.IO.StreamReader(@"c:\does-not-exist");
}
catch(Exception ex)
{
Console.WriteLine(ex.ToString())
}
Thread.CurrentThread.CurrentCulture = oldCI;
Thread.CurrentThread.CurrentUICulture = oldCI;
Bez obejścia.
Tks:)
. NET framework składa się z dwóch części:
- sam. NET framework
- pakiety językowe. NET framework
Wszystkie teksty (ex. komunikaty WYJĄTKÓW, etykiety przycisków na MessageBox, itp.) są w języku angielskim w samym. NET framework. Pakiety językowe mają zlokalizowane teksty.
W zależności od twojej sytuacji, rozwiązaniem byłoby odinstalowanie pakietów językowych (np. poinformowanie klienta, aby to zrobił). W takim przypadku teksty WYJĄTKÓW będą w języku angielskim. Należy jednak pamiętać, że wszystkie inne teksty dostarczane przez framework będą również w języku angielskim (np. etykiety przycisków na MessageBox, skróty klawiaturowe do poleceń aplikacji).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-28 12:34:30
Miałem taką samą sytuację i wszystkie odpowiedzi, które znalazłem tu i gdzie indziej, nie pomogły lub nie były satysfakcjonujące:
Wymuś wyjątki w języku angielskim
C# - otrzymywanie komunikatów o wyjątkach w języku angielskim, gdy aplikacja jest w innym języku?
Jak zmienić język wiadomości WYJĄTKÓW Visual Studio na angielski podczas debugowania
Jak poradzić sobie z tłumaczeniem wiadomości o wyjątkach?
Jak całkowicie uniknąć zlokalizowanego. NET komunikaty WYJĄTKÓW
Thread.CurrentUICulture
zmienia język WYJĄTKÓW. NET, ale nie dla Win32Exception
, który używa zasobów systemu Windows w języku samego interfejsu użytkownika systemu Windows. Więc nigdy nie udało mi się wydrukować wiadomości Win32Exception
po angielsku zamiast po niemiecku, nawet używając FormatMessage()
jak opisano w
Jak uzyskać Win32Exception po polsku?
Dlatego stworzyłem własne rozwiązanie, które przechowuje większość istniejących komunikatów wyjątków dla różnych języków w Pliki Zewnętrzne. Nie otrzymasz dokładnej wiadomości w wybranym języku, ale otrzymasz wiadomość w tym języku, która jest znacznie większa niż obecnie (która jest wiadomością w języku, którego prawdopodobnie nie rozumiesz).
Statyczne funkcje tej klasy mogą być wykonywane w instalacjach Windows z różnymi językami:
CreateMessages()
tworzy teksty specyficzne dla kulturySaveMessagesToXML()
zapisuje je do tylu plików XML, ile języków są tworzone lub ładowaneLoadMessagesFromXML()
wczytuje wszystkie pliki XML z wiadomościami specyficznymi dla języka
Podczas tworzenia plików XML w różnych instalacjach systemu Windows z różnymi językami, wkrótce będziesz mieć wszystkie języki, których potrzebujesz.
Może możesz tworzyć teksty dla różnych języków w systemie Windows 1, gdy masz zainstalowanych wiele pakietów językowych MUI, ale jeszcze tego nie testowałem.
Testowany z VS2008, gotowy do użycia. Komentarze i sugestie mile widziane!
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Globalization;
using System.Reflection;
using System.Threading;
using System.Xml;
public struct CException
{
//----------------------------------------------------------------------------
public CException(Exception i_oException)
{
m_oException = i_oException;
m_oCultureInfo = null;
m_sMessage = null;
}
//----------------------------------------------------------------------------
public CException(Exception i_oException, string i_sCulture)
{
m_oException = i_oException;
try
{ m_oCultureInfo = new CultureInfo(i_sCulture); }
catch
{ m_oCultureInfo = CultureInfo.InvariantCulture; }
m_sMessage = null;
}
//----------------------------------------------------------------------------
public CException(Exception i_oException, CultureInfo i_oCultureInfo)
{
m_oException = i_oException;
m_oCultureInfo = i_oCultureInfo == null ? CultureInfo.InvariantCulture : i_oCultureInfo;
m_sMessage = null;
}
//----------------------------------------------------------------------------
// GetMessage
//----------------------------------------------------------------------------
public string GetMessage() { return GetMessage(m_oException, m_oCultureInfo); }
public string GetMessage(String i_sCulture) { return GetMessage(m_oException, i_sCulture); }
public string GetMessage(CultureInfo i_oCultureInfo) { return GetMessage(m_oException, i_oCultureInfo); }
public static string GetMessage(Exception i_oException) { return GetMessage(i_oException, CultureInfo.InvariantCulture); }
public static string GetMessage(Exception i_oException, string i_sCulture)
{
CultureInfo oCultureInfo = null;
try
{ oCultureInfo = new CultureInfo(i_sCulture); }
catch
{ oCultureInfo = CultureInfo.InvariantCulture; }
return GetMessage(i_oException, oCultureInfo);
}
public static string GetMessage(Exception i_oException, CultureInfo i_oCultureInfo)
{
if (i_oException == null) return null;
if (i_oCultureInfo == null) i_oCultureInfo = CultureInfo.InvariantCulture;
if (ms_dictCultureExceptionMessages == null) return null;
if (!ms_dictCultureExceptionMessages.ContainsKey(i_oCultureInfo))
return CreateMessage(i_oException, i_oCultureInfo);
Dictionary<string, string> dictExceptionMessage = ms_dictCultureExceptionMessages[i_oCultureInfo];
string sExceptionName = i_oException.GetType().FullName;
sExceptionName = MakeXMLCompliant(sExceptionName);
Win32Exception oWin32Exception = (Win32Exception)i_oException;
if (oWin32Exception != null)
sExceptionName += "_" + oWin32Exception.NativeErrorCode;
if (dictExceptionMessage.ContainsKey(sExceptionName))
return dictExceptionMessage[sExceptionName];
else
return CreateMessage(i_oException, i_oCultureInfo);
}
//----------------------------------------------------------------------------
// CreateMessages
//----------------------------------------------------------------------------
public static void CreateMessages(CultureInfo i_oCultureInfo)
{
Thread oTH = new Thread(new ThreadStart(CreateMessagesInThread));
if (i_oCultureInfo != null)
{
oTH.CurrentCulture = i_oCultureInfo;
oTH.CurrentUICulture = i_oCultureInfo;
}
oTH.Start();
while (oTH.IsAlive)
{ Thread.Sleep(10); }
}
//----------------------------------------------------------------------------
// LoadMessagesFromXML
//----------------------------------------------------------------------------
public static void LoadMessagesFromXML(string i_sPath, string i_sBaseFilename)
{
if (i_sBaseFilename == null) i_sBaseFilename = msc_sBaseFilename;
string[] asFiles = null;
try
{
asFiles = System.IO.Directory.GetFiles(i_sPath, i_sBaseFilename + "_*.xml");
}
catch { return; }
ms_dictCultureExceptionMessages.Clear();
for (int ixFile = 0; ixFile < asFiles.Length; ixFile++)
{
string sXmlPathFilename = asFiles[ixFile];
XmlDocument xmldoc = new XmlDocument();
try
{
xmldoc.Load(sXmlPathFilename);
XmlNode xmlnodeRoot = xmldoc.SelectSingleNode("/" + msc_sXmlGroup_Root);
string sCulture = xmlnodeRoot.SelectSingleNode(msc_sXmlGroup_Info + "/" + msc_sXmlData_Culture).Value;
CultureInfo oCultureInfo = new CultureInfo(sCulture);
XmlNode xmlnodeMessages = xmlnodeRoot.SelectSingleNode(msc_sXmlGroup_Messages);
XmlNodeList xmlnodelistMessage = xmlnodeMessages.ChildNodes;
Dictionary<string, string> dictExceptionMessage = new Dictionary<string, string>(xmlnodelistMessage.Count + 10);
for (int ixNode = 0; ixNode < xmlnodelistMessage.Count; ixNode++)
dictExceptionMessage.Add(xmlnodelistMessage[ixNode].Name, xmlnodelistMessage[ixNode].InnerText);
ms_dictCultureExceptionMessages.Add(oCultureInfo, dictExceptionMessage);
}
catch
{ return; }
}
}
//----------------------------------------------------------------------------
// SaveMessagesToXML
//----------------------------------------------------------------------------
public static void SaveMessagesToXML(string i_sPath, string i_sBaseFilename)
{
if (i_sBaseFilename == null) i_sBaseFilename = msc_sBaseFilename;
foreach (KeyValuePair<CultureInfo, Dictionary<string, string>> kvpCultureExceptionMessages in ms_dictCultureExceptionMessages)
{
string sXmlPathFilename = i_sPath + i_sBaseFilename + "_" + kvpCultureExceptionMessages.Key.TwoLetterISOLanguageName + ".xml";
Dictionary<string, string> dictExceptionMessage = kvpCultureExceptionMessages.Value;
XmlDocument xmldoc = new XmlDocument();
XmlWriter xmlwriter = null;
XmlWriterSettings writerSettings = new XmlWriterSettings();
writerSettings.Indent = true;
try
{
XmlNode xmlnodeRoot = xmldoc.CreateElement(msc_sXmlGroup_Root);
xmldoc.AppendChild(xmlnodeRoot);
XmlNode xmlnodeInfo = xmldoc.CreateElement(msc_sXmlGroup_Info);
XmlNode xmlnodeMessages = xmldoc.CreateElement(msc_sXmlGroup_Messages);
xmlnodeRoot.AppendChild(xmlnodeInfo);
xmlnodeRoot.AppendChild(xmlnodeMessages);
XmlNode xmlnodeCulture = xmldoc.CreateElement(msc_sXmlData_Culture);
xmlnodeCulture.InnerText = kvpCultureExceptionMessages.Key.Name;
xmlnodeInfo.AppendChild(xmlnodeCulture);
foreach (KeyValuePair<string, string> kvpExceptionMessage in dictExceptionMessage)
{
XmlNode xmlnodeMsg = xmldoc.CreateElement(kvpExceptionMessage.Key);
xmlnodeMsg.InnerText = kvpExceptionMessage.Value;
xmlnodeMessages.AppendChild(xmlnodeMsg);
}
xmlwriter = XmlWriter.Create(sXmlPathFilename, writerSettings);
xmldoc.WriteTo(xmlwriter);
}
catch (Exception e)
{ return; }
finally
{ if (xmlwriter != null) xmlwriter.Close(); }
}
}
//----------------------------------------------------------------------------
// CreateMessagesInThread
//----------------------------------------------------------------------------
private static void CreateMessagesInThread()
{
Thread.CurrentThread.Name = "CException.CreateMessagesInThread";
Dictionary<string, string> dictExceptionMessage = new Dictionary<string, string>(0x1000);
GetExceptionMessages(dictExceptionMessage);
GetExceptionMessagesWin32(dictExceptionMessage);
ms_dictCultureExceptionMessages.Add(Thread.CurrentThread.CurrentUICulture, dictExceptionMessage);
}
//----------------------------------------------------------------------------
// GetExceptionTypes
//----------------------------------------------------------------------------
private static List<Type> GetExceptionTypes()
{
Assembly[] aoAssembly = AppDomain.CurrentDomain.GetAssemblies();
List<Type> listoExceptionType = new List<Type>();
Type oExceptionType = typeof(Exception);
for (int ixAssm = 0; ixAssm < aoAssembly.Length; ixAssm++)
{
if (!aoAssembly[ixAssm].GlobalAssemblyCache) continue;
Type[] aoType = aoAssembly[ixAssm].GetTypes();
for (int ixType = 0; ixType < aoType.Length; ixType++)
{
if (aoType[ixType].IsSubclassOf(oExceptionType))
listoExceptionType.Add(aoType[ixType]);
}
}
return listoExceptionType;
}
//----------------------------------------------------------------------------
// GetExceptionMessages
//----------------------------------------------------------------------------
private static void GetExceptionMessages(Dictionary<string, string> i_dictExceptionMessage)
{
List<Type> listoExceptionType = GetExceptionTypes();
for (int ixException = 0; ixException < listoExceptionType.Count; ixException++)
{
Type oExceptionType = listoExceptionType[ixException];
string sExceptionName = MakeXMLCompliant(oExceptionType.FullName);
try
{
if (i_dictExceptionMessage.ContainsKey(sExceptionName))
continue;
Exception e = (Exception)(Activator.CreateInstance(oExceptionType));
i_dictExceptionMessage.Add(sExceptionName, e.Message);
}
catch (Exception)
{ i_dictExceptionMessage.Add(sExceptionName, null); }
}
}
//----------------------------------------------------------------------------
// GetExceptionMessagesWin32
//----------------------------------------------------------------------------
private static void GetExceptionMessagesWin32(Dictionary<string, string> i_dictExceptionMessage)
{
string sTypeName = MakeXMLCompliant(typeof(Win32Exception).FullName) + "_";
for (int iError = 0; iError < 0x4000; iError++) // Win32 errors may range from 0 to 0xFFFF
{
Exception e = new Win32Exception(iError);
if (!e.Message.StartsWith("Unknown error (", StringComparison.OrdinalIgnoreCase))
i_dictExceptionMessage.Add(sTypeName + iError, e.Message);
}
}
//----------------------------------------------------------------------------
// CreateMessage
//----------------------------------------------------------------------------
private static string CreateMessage(Exception i_oException, CultureInfo i_oCultureInfo)
{
CException oEx = new CException(i_oException, i_oCultureInfo);
Thread oTH = new Thread(new ParameterizedThreadStart(CreateMessageInThread));
oTH.Start(oEx);
while (oTH.IsAlive)
{ Thread.Sleep(10); }
return oEx.m_sMessage;
}
//----------------------------------------------------------------------------
// CreateMessageInThread
//----------------------------------------------------------------------------
private static void CreateMessageInThread(Object i_oData)
{
if (i_oData == null) return;
CException oEx = (CException)i_oData;
if (oEx.m_oException == null) return;
Thread.CurrentThread.CurrentUICulture = oEx.m_oCultureInfo == null ? CultureInfo.InvariantCulture : oEx.m_oCultureInfo;
// create new exception in desired culture
Exception e = null;
Win32Exception oWin32Exception = (Win32Exception)(oEx.m_oException);
if (oWin32Exception != null)
e = new Win32Exception(oWin32Exception.NativeErrorCode);
else
{
try
{
e = (Exception)(Activator.CreateInstance(oEx.m_oException.GetType()));
}
catch { }
}
if (e != null)
oEx.m_sMessage = e.Message;
}
//----------------------------------------------------------------------------
// MakeXMLCompliant
// from https://www.w3.org/TR/xml/
//----------------------------------------------------------------------------
private static string MakeXMLCompliant(string i_sName)
{
if (string.IsNullOrEmpty(i_sName))
return "_";
System.Text.StringBuilder oSB = new System.Text.StringBuilder();
for (int ixChar = 0; ixChar < (i_sName == null ? 0 : i_sName.Length); ixChar++)
{
char character = i_sName[ixChar];
if (IsXmlNodeNameCharacterValid(ixChar, character))
oSB.Append(character);
}
if (oSB.Length <= 0)
oSB.Append("_");
return oSB.ToString();
}
//----------------------------------------------------------------------------
private static bool IsXmlNodeNameCharacterValid(int i_ixPos, char i_character)
{
if (i_character == ':') return true;
if (i_character == '_') return true;
if (i_character >= 'A' && i_character <= 'Z') return true;
if (i_character >= 'a' && i_character <= 'z') return true;
if (i_character >= 0x00C0 && i_character <= 0x00D6) return true;
if (i_character >= 0x00D8 && i_character <= 0x00F6) return true;
if (i_character >= 0x00F8 && i_character <= 0x02FF) return true;
if (i_character >= 0x0370 && i_character <= 0x037D) return true;
if (i_character >= 0x037F && i_character <= 0x1FFF) return true;
if (i_character >= 0x200C && i_character <= 0x200D) return true;
if (i_character >= 0x2070 && i_character <= 0x218F) return true;
if (i_character >= 0x2C00 && i_character <= 0x2FEF) return true;
if (i_character >= 0x3001 && i_character <= 0xD7FF) return true;
if (i_character >= 0xF900 && i_character <= 0xFDCF) return true;
if (i_character >= 0xFDF0 && i_character <= 0xFFFD) return true;
// if (i_character >= 0x10000 && i_character <= 0xEFFFF) return true;
if (i_ixPos > 0)
{
if (i_character == '-') return true;
if (i_character == '.') return true;
if (i_character >= '0' && i_character <= '9') return true;
if (i_character == 0xB7) return true;
if (i_character >= 0x0300 && i_character <= 0x036F) return true;
if (i_character >= 0x203F && i_character <= 0x2040) return true;
}
return false;
}
private static string msc_sBaseFilename = "exception_messages";
private static string msc_sXmlGroup_Root = "exception_messages";
private static string msc_sXmlGroup_Info = "info";
private static string msc_sXmlGroup_Messages = "messages";
private static string msc_sXmlData_Culture = "culture";
private Exception m_oException;
private CultureInfo m_oCultureInfo;
private string m_sMessage;
static Dictionary<CultureInfo, Dictionary<string, string>> ms_dictCultureExceptionMessages = new Dictionary<CultureInfo, Dictionary<string, string>>();
}
internal class Program
{
public static void Main()
{
CException.CreateMessages(null);
CException.SaveMessagesToXML(@"d:\temp\", "emsg");
CException.LoadMessagesFromXML(@"d:\temp\", "emsg");
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:59
Powinieneś zapisać stos wywołań zamiast tylko komunikat o błędzie (IIRC, simple exception.ToString () powinien zrobić to za Ciebie). Stamtąd możesz dokładnie określić, skąd pochodzi wyjątek i zazwyczaj wydedukować, który to wyjątek.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-27 18:49:53
Nadpisuje komunikat wyjątku w bloku catch używając metody extension, sprawdź, czy wiadomość jest z kodu lub nie, jak wspomniano poniżej.
public static string GetEnglishMessageAndStackTrace(this Exception ex)
{
CultureInfo currentCulture = Thread.CurrentThread.CurrentUICulture;
try
{
dynamic exceptionInstanceLocal = System.Activator.CreateInstance(ex.GetType());
string str;
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
if (ex.Message == exceptionInstanceLocal.Message)
{
dynamic exceptionInstanceENG = System.Activator.CreateInstance(ex.GetType());
str = exceptionInstanceENG.ToString() + ex.StackTrace;
}
else
{
str = ex.ToString();
}
Thread.CurrentThread.CurrentUICulture = currentCulture;
return str;
}
catch (Exception)
{
Thread.CurrentThread.CurrentUICulture = currentCulture;
return ex.ToString();
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-28 11:57:35
Do celów logowania, niektóre aplikacje mogą wymagać pobrania komunikatu wyjątku w języku angielskim (poza wyświetlaniem go w zwykłym UICulture klienta).
W tym celu następujący kod
- zmienia Aktualny UICulture
- odtwarza wyrzucony obiekt wyjątku za pomocą aktywatora" GetType ()"&".CreateInstance (t) "
- wyświetla wiadomość nowego obiektu wyjątku w nowym UICuture
-
I wreszcie zmienia obecną UICulture z powrotem na wcześniej UICulture.
try { int[] a = { 3, 6 }; Console.WriteLine(a[3]); //Throws index out of bounds exception System.IO.StreamReader sr = new System.IO.StreamReader(@"c:\does-not-exist"); // throws file not found exception throw new System.IO.IOException(); } catch (Exception ex) { Console.WriteLine(ex.Message); Type t = ex.GetType(); CultureInfo CurrentUICulture = System.Threading.Thread.CurrentThread.CurrentUICulture; System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en-US"); object o = Activator.CreateInstance(t); System.Threading.Thread.CurrentThread.CurrentUICulture = CurrentUICulture; // Changing the UICulture back to earlier culture Console.WriteLine(((Exception)o).Message.ToString()); Console.ReadLine(); }
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-16 10:40:56