使用&;try/catch嵌套
本文关键字:catch 嵌套 try amp 使用 | 更新日期: 2023-09-27 18:27:10
这个问题更像是一个做某事的正确方法。。。
问题。。。在using
块和try/catch
块之间是否存在适当的嵌套顺序?
将整个using
语句嵌套在try/catch
中并保持using
块的优点可以吗?(或者异常是否会导致using语句的关闭部分被抛出窗口)
还是应该将try/catch
嵌套在using
语句中,并且只围绕执行数据库访问的语句?
是。。。
try {
using( tsmtcowebEntities db = new tsmtcowebEntities() ) {
violationList = ( from a in db.DriverTrafficViolationDetails
where a.DriverTrafficViolation.DriverApplicationId == DriverAppId
orderby a.DateOfOccurance descending
select a ).ToList<DriverTrafficViolationDetail>();
GeneralViolation = ( from a in db.DriverTrafficViolations
where a.DriverApplicationId == DriverAppId
select a ).FirstOrDefault();
}
} catch { }
比…更不正确。。。
using( tsmtcowebEntities db = new tsmtcowebEntities() ) {
try {
violationList = ( from a in db.DriverTrafficViolationDetails
where a.DriverTrafficViolation.DriverApplicationId == DriverAppId
orderby a.DateOfOccurance descending
select a ).ToList<DriverTrafficViolationDetail>();
GeneralViolation = ( from a in db.DriverTrafficViolations
where a.DriverApplicationId == DriverAppId
select a ).FirstOrDefault();
} catch { }
}
后者更好:它将避免屏蔽最终抛出dy dispose
的异常。请参阅本文。
这实际上是一个风格问题,以及您希望保持db
:的范围有多窄
如果using在try/catch块内,则db
变量将只能在try部分内访问。
如果使用在try/catch块之外,那么它将在catch部分中可见。
无论如何,变量都会被正确地处理,因为using块相当于try/finaly。
就我个人而言,我想知道为什么你需要在那里捕捉异常,如果有什么不同的话,你能做些什么。
using
与try/catch
的嵌套可预测,并且Dispose
将在所有路径上调用。可预测意味着控制始终来自内部->外部范围的流(对于异常和正常流返回)。
那么问题是:什么时候应该执行与Dispose
相关的捕获,捕捉的范围应该是什么?答案会因代码而异,但如果需要访问db
,答案显然必须是"在内部";如果代码作为的一部分执行,则答案必须是"外部"。using
*可能是异常的来源。
(此外,空的捕获块很恶心!我认为它们是"为了演示目的"。)
快乐的编码。
*请注意,如果存在new tsmtcowebEntities()
或(如J.N.所指出的)Dispose
抛出的异常,则外部catch将捕获这些异常。(如果任何一个构造都可以抛出异常,那就完全是另一个话题了;-)我更喜欢在尽可能靠近源的地方捕获异常,并让我不知道如何在某些顶级构造(例如事件处理程序)中处理除之外的未捕获的异常。
我建议将try/catch放在using中,因为无论是否抛出异常,您都应该处理类型的一次性实体容器