我在.net 3.5中创建asp.net web应用程序,我想知道何时使用以及何时不使用Try Catch Finally块?特别是,我的大部分try catch都围绕执行存储过程并填充文本字段或网格视图?你会用Try Catch吗? 每次 当您执行存储过程并填充数据显示控件?
我的代码块通常如下所示:
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
{ }
}
答案是“它取决于”。
您可能想要使用 try{...} catch {...}
围绕每个原子操作,以便在出现问题时可以回滚到上一个良好状态(使用事务)。这可能是一个或多个存储过程 - 这取决于您的应用程序。
如果要捕获异常,请确保明确指出捕获的异常。你不应该 catch (Exception ex)
要么 catch()
- 称为“catch all”异常处理 - 但具有特定的catch语句 catch (IndexOutOfRangeException ex)
(例如)改为。
但是,如果您无法处理异常或者您无法清除任何内容,那么您不应该捕获它。
你应该只使用 try catch
,当你打算在catch块中处理异常时。我的意思是句柄,记录错误,选择不同的路径,因为错误等。如果你只是打算重新投掷它,没有必要尝试捕获。
正如其他人所说,这取决于。我倾向于在两种情况下使用try / catch / finally块:
除了这两种情况,我让调用代码处理可能发生的任何异常。
除了别人说的话,一定要避免这样做:
try
{
throw new ApplicationException("Fake sql ex");
}
//catch and do nothing. swallowing exceptions
catch(Exception){ }
大多数情况下,您不应该捕获异常。有些地方确实有必要捕捉例外情况,例如:
何时可以从该特定异常中恢复。
当您需要记录或报告它时(例如,向用户报告) - 通常在代码的顶层。
当您的代码的调用者无法处理异常时,您需要将它们转换为其他一些错误格式。
此外,using block语句可用于实际调用IDisposable对象上的Dispose,这样就不需要try ... finally。
是什么 Exception
你期待存储过程?提供你不要使用 口袋妖怪异常处理 并确切地知道您的应用程序应该做什么,任何不符合您想要捕获的特定Exception的内容都将被 Application
目的。
换句话说不要使用 catch {}
要么 catch (Exception)
,但专门的异常处理:
catch(SqlException e)
{
// Log stacktrace and show a friendly error to your user
}
该 应用程序错误 事件是应该捕获意外行为的地方,并且比仅仅让客户回复您说“我的字段没有显示任何内容”更容易追踪。
在最内层循环中使用“try catch”,在发生特定异常时应继续执行。请注意,如果你有一个循环执行10,000次并且例如发生异常,例如第十次重复不会影响其他9,990,它可能有助于捕获异常并让循环继续运行。另一方面,如果异常表明故障表明循环中的第11,12,13等等也将失败,那么让异常终止循环比继续重试操作要快得多那是行不通的。