我在.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
{ }
}
答案 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等等也将失败,那么让异常终止循环比继续重试操作要快得多那是行不通的。