Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# try-catch子句上显示异常_C#_.net_Exception_Try Catch - Fatal编程技术网

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());         
      }