C# try-catch子句上显示异常
到目前为止,每当我想显示从代码中抛出的异常时,我都会使用:C# try-catch子句上显示异常,c#,.net,exception,try-catch,C#,.net,Exception,Try Catch,到目前为止,每当我想显示从代码中抛出的异常时,我都会使用: try { // Code that may throw different exceptions } catch (Exception ex) { MessageBox.Show(ex.ToString()); } 我使用上述代码主要是为了调试,以便查看异常的确切类型以及引发异常的相应原因 在我现在创建的一个项目中,我使用了几个try-catch子句,我希望在出现异常时显示一条弹出消息,使其更“用户
try
{
// Code that may throw different exceptions
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
我使用上述代码主要是为了调试,以便查看异常的确切类型以及引发异常的相应原因
在我现在创建的一个项目中,我使用了几个try-catch
子句,我希望在出现异常时显示一条弹出消息,使其更“用户友好”。所谓“用户友好”,我指的是一条消息,它将隐藏诸如空引用异常或参数超出范围异常之类的短语,这些短语当前与上述代码一起显示
但是,我仍然希望看到创建消息的异常类型的相关信息
是否有方法根据以前的需要格式化抛出异常的显示输出?
Exception.Message
提供了比Exception.ToString()更(但不完全)友好的消息。考虑这个设计实例:
try
{
throw new InvalidOperationException();
}
catch(InvalidOperationException ex)
{
Console.WriteLine(ex.ToString());
}
虽然Message
生成的消息比ToString()简单
但显示的消息对用户来说仍然意义不大。手动接受异常并向用户显示一条自定义消息来帮助用户解决此问题,根本不需要花费太多精力
try
{
using (StreamReader reader = new StreamReader("fff")){}
}
catch(ArgumentException argumentEx)
{
Console.WriteLine("The path that you specified was invalid");
Debug.Print(argumentEx.Message);
}
catch (FileNotFoundException fileNotFoundEx)
{
Console.WriteLine("The program could not find the specified path");
Debug.Print(fileNotFoundEx.Message);
}
您甚至可以使用Debug.Print
将文本输出到即时窗口或输出窗口(取决于您的VS首选项)以进行调试。您可以使用属性获取描述当前异常的消息
catch (Exception ex)
{
MessageBox.Show(ex.Messagge());
}
使用上面的代码
也可以将自定义错误消息显示为:
try
{
/////Code that may throws several types of Exceptions
}
catch (Exception ex)
{
MessageBox.Show("Custom Error Text "+ex.Message);
}
附加:
有关ex.toString()和ex.Message之间的差异,请参见:
所有细节和示例:
您可以使用.Message
,但是我不建议直接捕获异常。尝试捕获多个异常或显式声明异常,并根据异常类型调整错误消息
try
{
// Operations
}
catch (ArgumentOutOfRangeException ex)
{
MessageBox.Show("The argument is out of range, please specify a valid argument");
}
捕获异常
是相当普遍的做法,可能会被视为不好的做法,因为它可能会在应用程序中隐藏bug
您还可以检查异常类型,并通过检查异常类型进行相应处理:
try
{
}
catch (Exception e)
{
if (e is ArgumentOutOfRangeException)
{
MessageBox.Show("Argument is out of range");
}
else if (e is FormatException)
{
MessageBox.Show("Format Exception");
}
else
{
throw;
}
}
如果异常是ArgumentOutOfRange或FormatException,它将向用户显示一个消息框,否则它将重新显示异常(并保留原始堆栈跟踪) 请尝试以下代码:
try
{
// Code that may throw different exceptions
}
catch (Exception exp)
{
MessageBox.Show(exp.Message());
}
诀窍是使用异常的Message方法:
catch(异常示例)
{
MessageBox.Show(例如消息“Error”、MessageBoxButtons.OK、MessageBoxIcon.Error);
}
您可以显示任何类型的消息,或以任何方式对异常作出反应,一旦捕获到异常,您就可以控制它。如果要调试,为什么不使用调试器呢?如果最终用户中出现任何意外异常,只需记录它并让程序终止。最好为每个异常添加一条消息,而不是仅添加1..添加多个catch块并在每个块中添加msgbox。不要直接抓住例外我现在有问题了…你们都提供了有用的答案,我不知道哪一个是正确的。。基本上,几乎每个人都提到的ex.toString()和ex.Message之间的区别在于,思考有助于MessageBox.Show(ex.Message)
您忘记了最后一个需要抛出的案例在第二个示例中,可以使用throw
为了在try-chain中进一步传播,使用ArgumentOutOfRangeException
和FormatException
编写多个catch
子句的问题是什么,而不是将if-else
语句写入一个catch
block@IlyaIvanov-我会推荐前者,因为我认为它更干净。我正在演示您可以检查异常类型(如果您捕获了泛型异常类型),但是,我的主要观点是,我更明确地声明要捕获的类型,而不是直接捕获异常
。好的,我同意,我只是认为最好提前教你如何正确组织捕获块。
try
{
// Code that may throw different exceptions
}
catch (Exception exp)
{
MessageBox.Show(exp.Message());
}