何时使用以及何时不使用Try Catch Finally

时间:2010-07-06 12:54:44

标签: c# asp.net .net-3.5 try-catch-finally

我在.net 3.5中创建asp.net网络应用程序,我想知道何时使用以及何时不使用Try Catch Finally块?特别是,我的大部分try catch都围绕执行存储过程并填充文本字段或网格视图?在执行存储过程并填充数据显示控件时,您会使用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
        { }
   }

7 个答案:

答案 0 :(得分:10)

答案是“它取决于”。

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

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

但是,如果您无法处理异常或者您无法清除任何内容,那么您就不应该捕获它。

答案 1 :(得分:4)

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

答案 2 :(得分:1)

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

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

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

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

答案 3 :(得分:1)

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

    try
    {
        throw new ApplicationException("Fake sql ex");
    }
    //catch and do nothing.  swallowing exceptions
    catch(Exception){ }                 

答案 4 :(得分:0)

大多数时候你不应该捕捉异常。有些地方确实有必要捕捉例外,例如,

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

此外,using block语句可用于实际调用IDisposable对象上的Dispose,这样就不需要try ... finally。

答案 5 :(得分:0)

您期望从存储过程中Exception是什么?如果您不使用pokemon exception handling并确切知道应用程序应该执行的操作,那么任何不符合您要捕获的特定Exception的内容都将被Application对象捕获。

换句话说,请勿使用catch {}catch (Exception),而应使用专门的异常处理:

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

Application.Error事件应该捕获意外行为,并且比仅仅让客户回复您说“我的字段没有显示任何内容”更容易追踪。

答案 6 :(得分:0)

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