SqlException未被捕获

3
我是一名有用的助手,可以为您进行文本翻译。以下是需要翻译的内容:

我有一个包含以下代码的ASP.Net应用程序:

    try
    {
        sql = new SqlProc("prcCustomerAgeSelect",
            SqlProc.InParam("@DateFrom", SqlDbType.DateTime, 8, _OrderDateFrom),
            SqlProc.InParam("@DateTo", SqlDbType.DateTime, 8, _OrderDateTo),
        sql.Command.CommandTimeout = 1;
        dt = sql.ExecuteTable();

    }
    catch (SqlException ex)
    {
        Filter.ErrorMessage = "Please narrow your search criteria.";
    }
请注意这一行:

sql.Command.CommandTimeout = 1;

这会导致抛出 SqlException 异常(用于测试)。
我本以为 catch 块会捕获此异常,但实际上它没有。相反,我得到了以下结果:

Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.

[SqlException (0x80131904): Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.]

为什么它没有捕获呢?我使用了错误的类型吗?我在这里漏掉了什么?
提前感谢您的帮助!
-Ev

请发布您的真实代码,您上面的代码无法编译,我们无法进行准确的评估,没有准确的代码。 - Nix
1
Console.WriteLine(ex.GetType().Name) 的输出是什么? - ChrisWue
2个回答

6

看起来你遇到的不是一个 SqlException

可能是 SqlProc 自己捕获了 SqlExceptions,从中提取了一些信息,然后抛出了一个不同类型的新异常(在新异常的消息中嵌入了一些原始信息)。


感谢您的快速回复!虽然我不认为这是原因,因为抛出到浏览器的异常是: 异常详细信息:System.Data.SqlClient.SqlException:超时已过期。操作未完成之前已经超时或服务器没有响应。 - Ev.
那么,我理解这意味着异常类型为System.Data.SqlClient.SqlException,这正是我想要捕获的。对吗? - Ev.
1
不对 - 我改正。某种原因,SqlException 被 ApplicationException 包装了起来:throw new ApplicationException(string.Format("Unexpected error executing: {0}", GetProcDebugString(cmd)), ex); - Ev.
你是对的,是SqlProc在做这件事。问题仍然存在,为什么屏幕上的异常说它是SqlExecption类型的异常,而实际上它是ApplicationException? - Ev.
@Ev:ApplicationException 很可能已经重写了 ToString() 方法。 - ChrisWue
1
@Ev - 非常感谢!这说明了在库代码(如SqlProc类)中捕获异常并且无法对其进行有用处理时,很少是一个好主意。 - Jeff Sternal

0

看起来可能是连接超时,而不是命令超时。

我建议您检查一下,确保可以使用更合理的超时值连接并运行查询,以验证这一点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接