12

我正在.net 3.5 中创建 asp.net web 应用程序,我想知道何时使用以及何时不使用 Try Catch finally 块?特别是,我的大部分尝试捕获都围绕执行存储的过程和填充文本字段或网格视图?当您执行存储过程并填充数据显示控件时,您会使用 Try Catch EVERYTIME吗?

我的代码块通常如下所示:

    protected void AddNewRecord()
    {
        try
        {
           //execute stored proc
           // populate grid view controls or textboxes
        }
        catch (Exception ex)
        {
           //display a messagebox to user that an error has occured
           //return
        }
        finally
        { }
   }
4

7 回答 7

11

答案是“视情况而定”。

您可能希望try{...} catch {...}在每个原子操作周围使用一个,这样如果出现问题,您可以回滚到最后一个良好状态(使用事务)。这可能是一个或多个存储过程 - 这取决于您的应用程序。

如果您要捕获异常,请确保您明确捕获了哪些异常。您不应该有catch (Exception ex)catch()- 称为“全部捕获”异常处理 - 而是有特定的 catch 语句,例如catch (IndexOutOfRangeException ex)(例如)。

但是,如果您无法处理异常或者您无法进行清理,那么您不应该捕获它。

于 2010-07-06T12:57:51.963 回答
4

try catch当您打算在 catch 块中处理异常时,您应该只使用, 。我所说的句柄是,记录错误,因为错误选择不同的路径等。如果你只是打算重新抛出它,那么尝试捕获是没有意义的。

于 2010-07-06T13:00:14.053 回答
1

正如其他人所说,这取决于。我倾向于在两种情况下使用 try/catch/finally 块:

  • 我需要以某种方式处理异常,而不是简单地重新抛出它。

  • 我需要清理finally块中的一些资源。

除了这两种情况,我让调用代码处理可能发生的任何异常。

于 2010-07-06T13:06:34.877 回答
1

除了其他人所说的,一定要避免这样做:

    try
    {
        throw new ApplicationException("Fake sql ex");
    }
    //catch and do nothing.  swallowing exceptions
    catch(Exception){ }                 
于 2010-07-06T13:08:08.003 回答
0

大多数情况下,您不应该捕获异常。在某些地方确实可以捕获异常,例如,

当您可以从该特定异常中恢复时。当您需要记录或报告它时(例如,向用户报告)——通常在代码的顶层。当你的代码的调用者不能处理异常时,你需要将它们转换成一些其他的错误格式。

此外,using 块语句可用于在 IDisposable 对象上实际调用 Dispose,从而无需 try...finally。

于 2010-07-06T12:59:12.473 回答
0

Exception您对存储过程的期望是什么?如果您不使用pokemon 异常处理并且确切地知道您的应用程序应该做什么,那么任何不符合您想要捕获的特定异常的东西都将被Application对象捕获。

换句话说,不要使用catch {}or catch (Exception),而是专门的异常处理:

catch(SqlException e)
{
   // Log stacktrace and show a friendly error to your user
}

Application.Error事件是应该捕获意外行为的地方,并且比简单地让客户返回给您说“我的字段没有显示任何内容”更容易跟踪。

于 2010-07-06T13:17:45.743 回答
0

在发生特定异常时应继续执行的最内层循环中使用“try catch”。请注意,如果您有一个执行 10,000 次的循环并且在例如第十次重复时发生异常,这不会影响其他 9,990,那么捕获异常并让循环继续运行可能很有用。另一方面,如果异常指示的错误表明循环的第 11、12、13 次等也将失败,那么让异常终止循环比继续重试操作要快得多那是行不通的。

于 2010-07-06T15:58:57.893 回答