使用&;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 { }
}

使用&;try/catch嵌套

后者更好:它将避免屏蔽最终抛出dy dispose的异常。请参阅本文。

这实际上是一个风格问题,以及您希望保持db:的范围有多窄

如果using在try/catch块内,则db变量将只能在try部分内访问。

如果使用在try/catch块之外,那么它将在catch部分中可见。

无论如何,变量都会被正确地处理,因为using块相当于try/finaly。

就我个人而言,我想知道为什么你需要在那里捕捉异常,如果有什么不同的话,你能做些什么。

usingtry/catch的嵌套可预测,并且Dispose将在所有路径上调用。可预测意味着控制始终来自内部->外部范围的流(对于异常和正常流返回)。

那么问题是:什么时候应该执行与Dispose相关的捕获捕捉的范围应该是什么?答案会因代码而异,但如果需要访问db,答案显然必须是"在内部";如果代码作为的一部分执行,则答案必须是"外部"。using*可能是异常的来源。

(此外,空的捕获块很恶心!我认为它们是"为了演示目的"。)

快乐的编码。


*请注意,如果存在new tsmtcowebEntities()或(如J.N.所指出的)Dispose抛出的异常,则外部catch将捕获这些异常。(如果任何一个构造都可以抛出异常,那就完全是另一个话题了;-)我更喜欢在尽可能靠近源的地方捕获异常,并让我不知道如何在某些顶级构造(例如事件处理程序)中处理除之外的未捕获的异常。

我建议将try/catch放在using中,因为无论是否抛出异常,您都应该处理类型的一次性实体容器