使用&尝试/捕捉嵌套

时间:2012-03-08 05:00:38

标签: c# try-catch using-statement

这个问题更多的是做某事的正确方法......

问题是...... 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 { }
}

4 个答案:

答案 0 :(得分:5)

后者更好:它将避免掩盖最终抛出dy dispose的异常。见article.

答案 1 :(得分:2)

这真的是一种风格问题,你希望保持db的范围有多窄:

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

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

无论如何,变量将被正确处理,因为using块相当于try / finally。

就我个人而言,我想知道为什么你需要在那里捕捉异常,以及你能用它们做什么。

答案 2 :(得分:1)

using可以预测,try/catchDispose将在路径上全部调用。可预测地意味着控制始终从内部流动 - >外部范围(对于异常和正常流程返回)。

问题是:何时 catch 应该与Dispose 的关系执行 catch 是?对此的答案因代码而异,但如果需要访问db则必须“内部”,如果代码作为 {{1>的一部分执行,则必须“在外部” *可能是异常的来源。

(另外,空的挡块是icky!我假设它们在那里“用于演示目的”。)

快乐的编码。


*请注意,外部捕获将捕获从using或(如J.N.所指出的)new tsmtcowebEntities()抛出的异常,如果存在的话。 (完全是另一个主题,如果它可以接受任何一个构造抛出异常;-)我更喜欢捕获尽可能接近源的异常并让异常我不知道如何处理“流失”未被捕获的某些顶级构造中的除外(例如事件处理程序)。

答案 3 :(得分:0)

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