【问题标题】:Customize Sql Exception message in catch在 catch 中自定义 Sql Exception 消息
【发布时间】:2013-02-19 23:40:38
【问题描述】:

我正在做一个用户可以插入/删除/添加实体的表单。我正在使用 Winforms c# 和实体框架 4。

好的,用户可以删除对象了。现在,这些对象可以被其他实体引用,所以如果用户想删除它,他会得到一个异常。

我捕捉到该异常,以便向他显示一条消息,说明该对象已开始在其他对象中使用。

我得到的异常是 (UpdateException)。但是,如果也存在更新问题,也会引发此异常。有没有办法使用这个异常从 Sql 获取错误代码?因为我确实有发生这种情况时抛出的错误代码。

如果我使用 SqlException,我可以检查它的编号,但这不是我收到的异常。

【问题讨论】:

  • 底层异常可能已经保存在更新异常的 InnerException 属性中。
  • 而不是捕获异常,为什么在尝试保存更改之前不检测条件?您似乎预计会出现此异常,因此您没有将异常用作异常,而是控制应用程序的流程。
  • 因为我必须检查每一个关系。我将为每个实体使用它。如果 sql 自己管理它,我为什么要这样做?你告诉我的和说“为什么要使用 try catch”是一样的。只需检查之前的每个错误可能性。只是不是一个选择。不过感谢您的回答

标签: c# winforms entity-framework-4 try-catch sqlexception


【解决方案1】:

您的意思是您想要查看完整的异常还是希望用户查看异常?

如果您想查看异常,可以将其写入文本文件:

try
{
    // do something
}
catch(SQLException sqlex)
{
    using (var file = new StreamWriter(@"C:\Users\Home\Desktop\sqlException.txt"))
    {
        file.WriteLine(sqlex.ToString());
    }
}
catch(Exception e)
{
    using (var file = new StreamWriter(@"C:\Users\Home\Desktop\generalException.txt"))
    {
        file.WriteLine(e.ToString());
    }
}

这会将异常写入桌面上的文本文件(根据需要更改目录)。

【讨论】:

  • -1:您的两个StreamWriter 实例需要位于using 块中。
  • 你的意思是把两个catch块包装在一个using块中吗?我只是从一个我只使用过一个 catch 块(有效)的样本中提取了这个——我在这里只放了两个 catch 块来表明他可以将不同的异常写入文件。我的回答不能解决问题吗?
  • 没有。在catch 块内:using (var file = new StreamWriter(...)){file.WriteLine(e.ToString());}
  • 在catch 块内泄露资源几乎是犯罪行为。
  • 每天学习新东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-17
  • 1970-01-01
  • 2022-11-02
  • 2021-12-19
  • 2013-08-12
  • 1970-01-01
  • 2020-01-16
相关资源
最近更新 更多