有时,异常类型足够独特,可以指示确切的问题,例如ArgumentOutOfRangeException.Othertimes,例外情况更为笼统,可能会因为多种原因而被抛出.在这种情况下,似乎在异常消息属性中找到了唯一的附加信息.
在我目前的情况下,我收到一个抛出错误消息的CommunicationException:
已超出传入邮件的最大邮件大小限额(65536)
由于可能通过CommunicationException抛出多个不同的错误,使用message属性确定原因是不好的做法,如下所示:
catch (CommunicationException ex)
{
if (Regex.IsMatch(ex.Message, "The maximum message size quota for incoming messages .* has been exceeded"))
{
// handle thrown exception
}
throw;
}
Run Code Online (Sandbox Code Playgroud)
这些消息在所有系统上都是恒定可靠的吗?是否还有其他考虑因素,例如本地化?
结论:
我使用'CommunicationException'的方案是一个糟糕的例子,因为我后来意识到InnerException属性中存在QuotaExceededException.由于回复,我知道要查找异常中存在的任何数据以指出确切原因.在这种情况下,它是InnerException属性.
关于是否应该使用消息属性来确定原因的问题,除非没有替代方案,否则应该避免应该避免的普遍共识.由于本地化,消息属性值可能不会在不同系统上保持不变.
我真的不知道在多语言应用程序中处理异常的最佳方法.
我应该在哪里处理错误消息的翻译(Exception.Message)?
如果我抛出异常,我应该在ctor中翻译消息吗?
throw new MyException("Error message", Resource.MyException_TranslatedMessage);
Run Code Online (Sandbox Code Playgroud)
或者我抛出异常并使用自制帮助程序,它将使用View逻辑中的异常类型找到错误消息?
try
{
//...
}
catch(Exception ex)
{
myLabel.Text = new ExceptionTranslator(ex).Translate();
}
Run Code Online (Sandbox Code Playgroud)
或者,Microsoft是否提供了一个工具或机制来执行此操作?
总之一句:处理异常消息翻译的好方法是什么?
在我的silverlight 4 MVVM应用程序中,我可以在运行时切换语言:
public void SetLanguage(string language)
{
var culture = new CultureInfo(language);
Thread.CurrentThread.CurrentUICulture = culture;
Thread.CurrentThread.CurrentCulture = culture;
// ...
}
Run Code Online (Sandbox Code Playgroud)
对于输入,我只是在转换问题的情况下添加了"ValidatesOnException = true"并且它完成了工作.但默认的异常消息是在我的操作系统文化中,而不是在手动选择的消息中.
在这个关于异常消息本地化的线程中,想法是改变CurrentCulture和CurrentUICulture,我做了.所以我有点卡住了.
我能做什么 ?
谢谢 :)
编辑:我试图在convertback方法中使用带有自定义异常的自定义转换器,以验证用户的输入.问题,转换方法中的异常不会被validatesOnException捕获,它会破坏应用程序.
编辑2:澄清 - >如果我有一个十进制属性绑定到一个文本框,我在这个文本框中输入"blabla",我想看到有一个问题,我希望该消息在运行时区域设置和不是操作系统区域设置.我不能在我的属性设置器中引发异常,因为我从未到达那里,默认转换器在此之前引发它自己的异常.
我希望它很清楚.如果我可以帮助你帮助我,请不要犹豫:)
我使用的是VS2012,.net 4.5和Win7 Professional.Win7是土耳其语,现在我收到土耳其语的错误消息!在Win7 Professional中,无法安装/卸载语言包.是否可以在不重新安装VS或.net包的情况下更改错误消息语言?
Exception无论我的程序运行的机器是什么语言,我都试图用英语获取所有消息.
我已经设法使用以下帖子中的答案获得几乎所有的英语异常消息:
英语异常消息?
和我发现的其他一些解决方案(比如使用反射来改变默认值CultureInfo).我有特定的问题SocketException,无论我在做什么,我都会使用默认机器的语言.
我已经创建了一个测试程序来显示问题:这个测试程序将以默认语言打印Exceptions:
using System;
using System.Text;
using System.Threading;
using System.IO;
using System.Net.Sockets;
using System.Reflection;
using System.Globalization;
namespace TestApp
{
class Program
{
static void Main(string[] args)
{
try
{
//I'm not listening on the following port:
TcpClient s = new TcpClient("localhost", 2121);
}
catch (Exception ex)
{
Console.WriteLine("Socket exception: " + ex.Message);
}
try
{
//the following file doesn't exists:
File.ReadAllText("filenotexist.txt");
}
catch (Exception ex)
{
Console.WriteLine("File exception: " + …Run Code Online (Sandbox Code Playgroud) 我有以下代码:
if (smtpException != null)
{
if (smtpException.InnerException.Message.Contains("net_io_connectionclosed"))
{
sendingFailedException = new EmailSendingFailedException(EmailsLocalization.EmailSendFailedWrongPortNumber, e);
}
if (smtpException.StatusCode == SmtpStatusCode.MustIssueStartTlsFirst ||
smtpException.Message.Contains("AUTH"))
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
当我依赖我的代码中的异常消息时,我可以确定它是英文的吗?