0

如果用户等待 5 分钟,当他们点击“有效”按钮时,我的表单会显示以下消息

服务器无法处理请求。---> 原始错误消息:获取实体失败时出现数据库问题。---> [IBM U2][UODOTNET - UNICLIENT][ErrorCode=45002] 无法对空记录 ID 执行操作

所以我想使用 try 和 catch 关键字,

但我有一个错误信息,这段代码:

try
            {

                SetPageState();
                Session["NewStep"] = "NewStepConfirm";
                Response.Redirect(stepone.aspx");
            }
            catch (Exception ex)
            {
                if (ex.ErrorCode == 45002)
                {
                    ErrorLabel.Text = "We are very sorry but don't wait for long time";
                }
                else
                {
                    ErrorLabel.Text = ex.Message;
                }
                ErrorLabel.Visible = true;
            }

这是一条消息错误

编译器错误消息:CS1061:“System.Exception”不包含“ErrorCode”的定义,并且找不到接受“System.Exception”类型的第一个参数的扩展方法“ErrorCode”(您是否缺少 using 指令或装配参考?)

源错误:

if (ex.ErrorCode == 45002)

如何使用 try 和 catch 关键字

谢谢

4

2 回答 2

2

删除 ErrorCode 的测试,在 catch 块中设置断点,在调试器中运行您的应用程序并重现故障。

当调试器在断点处停止时,检查异常对象。它是什么类型的?它有哪些领域?此异常对象可能具有您所追求的 ErrorCode。如果是这样,你就完成了。编辑您的 catch 子句以捕获该特定异常类型。

但是,错误消息的结构(“-->”和“原始消息”)向我表明这可能是一个包装异常 - 核心代码抛出的异常 A 被中间代码捕获,中间代码抛出异常 B。希望B 将在 InnerException 属性中保留对原始异常 A 的引用。检查异常对象的 InnerException 属性,以及该对象的 InnerException 属性,依此类推,以找到原始异常,因为它最有可能包含您需要的数据。

您在文本中看到的错误代码可能不是任何异常对象的正式属性,它可能只是嵌入在字符串中的数据。

如果您所追求的数据被埋在 InnerException 中,您将无法捕捉到它。您必须捕获最外层异常的类型(调试器在断点处停止时 ex 变量的类型),然后在 InnerException 链中挖掘以提取您所需要的数据。

于 2012-11-29T18:15:57.897 回答
1

您需要捕获抛出的特定类型的异常。

捕获基本异常类被认为是不好的做法(或至少是最后的努力)。如果您捕获特定的异常类型,您将可以访问您正在寻找的属性。

try
{
  DoSomethingThatThrowsACustomWidgetException() ;
}
catch (CustomWidgetException e )
{
  int errorCode = e.ErrorCode ;
  ...
}

如果您捕获了基 Exception 类,则需要将其向下转换为它的类型:

try
{
  DoSomethingThatThrowsACustomWidgetException() ;
}
catch ( Exception e )
{
  CustomWidgetException cwe = e as CustomWidgetException ;

  if ( cwe == null ) throw ;

  int errorCode = cwe.ErrorCode ;
  ...

}

简单的!

于 2012-11-29T18:15:15.230 回答