2014-11-23 112 views
0

如何根据出现的错误来设置自定义错误消息?自定义异常消息C#

 protected void btnNew_Click(object sender, EventArgs e) 
    { 
     Clear(); 
     SqlCommand command = conn.CreateCommand(); 
     SqlDataReader reader; 
     try 
     { 
      command.CommandText = "GetMax"; 
      command.CommandType = CommandType.StoredProcedure; 
      conn.Open(); 
      reader = command.ExecuteReader();     
      while (reader.HasRows) 
      { 
       while (reader.Read()) 
       { 
        int CustMax = reader.GetInt32(0); 
        CustMax++; 
        txtCustID.Text = CustMax.ToString(); 
       } 
       reader.NextResult(); 
      } 
      reader.Dispose(); 
     } 
     catch (SqlException ex) 
     { 
      lblMessage.Text = ex.Message; 

     } 
     finally 
     { 
      command.Dispose(); 
      conn.Dispose(); 
     } 
    } 

在此代码块中,如果发现SqlException,它的消息将显示在lblMessage中。

我在看的主要是如果有一个连接到数据库或没有。如果没有,则会导致以下错误:“建立到SQL Server的连接时发生网络相关或实例特定的错误。服务器未找到或无法访问。请确认实例名称是否正确,以及SQL Server配置为允许远程连接(提供程序:命名管道提供程序,错误:40 - 无法打开与SQL Server的连接)“。

如果发生错误40,我想将lblMessage设置为“无法连接到数据库”,但是如果发生不同的SqlException,它应该发布完整的错误消息。

+0

您使用的.NET Framework的版本? – Alireza 2014-11-23 07:03:53

回答

2

这里是你怎么处理,

catch (SqlException ex) 
    { 
     if(ex.Number == 40) // or Use whatever the number it returns for the relevant error 
     { 
      MessageBox.Show("Relevant SQL Error Occured"); 
     } 
     else 
     { 
      MessageBox.Show("None Relevant SQL Error Occured:" + ex.toString()); 
     } 
    } 
    catch(Exception ex)// All other non sql errors 
    { 
     MessageBox.Show(ex.toString()); 
    } 

看看这个MSDN差错处理技术的更多信息Link

+0

我已经将它标记为答案,因为它应该工作,但奇怪的是,它实际上是通过“其他”部分?例外数字是40,它清楚地在错误消息“(provider:Named Pipes Provider,** error:40 ** - 无法打开与SQL Server的连接)中声明它。”那么为什么它不注册为40? – mrkd1991 2014-11-25 13:49:46

+0

你是否使用比较条件作为错误号码或只是一个字符串消息? – Kirk 2014-11-25 13:59:38

+0

如果错误信息编号是40,意味着它应该等于40?!或尝试ex.Equals转换为 – Kirk 2014-11-25 14:00:25

2

您可以修改您的代码像

catch (SqlException ex) 
{ 
    if(ex.Number == 40) // 40 is specific key for network issue 
    { 
     lblMessage.Text = "Cannot connect to database" 
    } 
    else 
    { 
    lblMessage.Text = ex.Message; 
    } 
} 

还有另一种方式来达到同样的事情,就像

catch ((SqlException ex) { 
if (ex.Message.Contains("A network-related or instance-specific error specific"))//Put the matching text here 
{ 
    lblMessage.Text = "Cannot connect to database" 
} 
else 
    { 
    lblMessage.Text = ex.Message; 
    } 
} 

但我会建议你捕获的异常与错误的数字,因为这将是给你干净代码和确切的错误将被捕获。