如何在C#中获取异常类型

时间:2010-09-15 07:03:29

标签: c# exception-handling

我想检查服务器是否无法访问,如果无法访问,我想在我的登录页面上打印友好消息。就像当用户输入其凭证时和我得到的异常

  

建立与SQL Server的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确,以及SQL Server是否配置为允许远程连接。 (提供者:命名管道提供程序,错误:40 - 无法打开与SQL Server的连接)

这个例外。那么我应该怎样在发生哪个异常时才能显示消息呢?

8 个答案:

答案 0 :(得分:22)

我知道这是一篇较旧的帖子,但是如果您要以相同的方式处理所有异常和/或使用错误报告或类似的信息(而不是通知用户的具体信息),您可以使用以下

try
{
    //do something here
}
catch(Exception ex)
{
    MessageBox.Show(ex.GetType().ToString()); //will print System.NullReferenceException for example
}

答案 1 :(得分:13)

您需要在代码时知道期望的异常,以便相应地捕获它们。正如Dimitrov所说,当与SQL服务器的连接失败时会抛出SQLException,因此特别注意这是一个很好的策略。

您希望按顺序捕获各种异常,如下所示:

try 
{
    //some code
}
catch(TypeOfException exOne) 
{
    //handle TypeOfException someway
}
catch (OtherTypeOfException exTwo) 
{
    //handle OtherTypeOfException some other way
}
catch (Exception ex) 
{
    //handle unknown exceptions in a general way
}
finally 
{
    //any required cleanup code goes here
}

尝试将最不寻常的例外放在最顶层,沿着列表向更常见的方向发展。 catch顺序是顺序的 - 如果你把catch(Exception)放在顶部,无论你在它下面编码什么例外,它总是会捕获该行。

答案 2 :(得分:7)

您可以尝试抓住SQLException

try 
{
    // Try sending a sample SQL query
} 
catch (SQLException ex) 
{
    // Print error message
}

答案 3 :(得分:6)

你可以使用你用来检查父类是否是类型子类的相同方法,这是使用

完成的
 obj is NotImplementedException

其中obj的类型为Exception,是所有异常的父类。

或者如果您想稍后使用异常对象,则可以使用:

var niException=obj as NotImplementedException
if(niException==null)  //will be null when object is not of type NotImplementedException
return;

当你有一个用于处理异常的集中式类并且不想添加多个catch语句时,这个逻辑特别有用

希望这有帮助。

答案 4 :(得分:2)

try  {
 //some code } catch(TypeOfException exOne)  {
 //handle TypeOfException someway } catch (OtherTypeOfException exTwo)  {
 //handle OtherTypeOfException some other way } catch (Exception ex)  {
 //handle unknown exceptions in a general way } finally  {
 //any required cleanup code goes here }

try/finallyusing几乎相同。 using将尝试对该对象执行某些操作,无论是否成功,它都会处置该对象以阻止内存泄漏,但不会忽略阻止代码继续运行的错误。

Try将尝试在大括号内执行代码,如果发生错误,它将忽略错误并退出Try子句,然后继续读取代码,除非错误是关键的,导致崩溃的程序。但是当using流时它不会确保流被关闭/处置,因为当发生错误时它退出try子句,然后到达你可能在底部添加的任何代码进行处理(坏习惯imo) )。

Try代码需要Catch(s)和/或Finally声明。 Catch使您有机会处理异常,一般或特定异常。使用的一个例子是,生成错误的文本文件并保存。 using不会让你处理异常。

using的另一个示例可能是,您有播放列表,找不到歌曲,例外区域nullreferece可能会从列表中删除该项目。

始终执行

Finally,即使错误很严重且程序崩溃,finally子句中的代码也会被执行,流对象就是你应该放置你的配置代码的地方,如果对象在try子句中失败,则它总是被处理掉。

希望我帮助提出一些关于使用和try / catch / finally的清晰度。

答案 5 :(得分:0)

你必须抓住例外:

try
{
      //Contact the server
}
catch(YourCouldNotContactServerException)
{
    //Show some friendly message
}

答案 6 :(得分:0)

 try 
{
    // Your code
} 
catch (SQLException ex) 
{
    Response.Write(ex.Message);//for web apps
Console.WriteLine(ex.Message);//for windows apps
}

答案 7 :(得分:-1)

我认为,解决方案是......

catch(Exception ex) {Response.Write(“发生错误:”+ ex.Message); }