这个问题更多的是做某事的正确方法......
问题是...... 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 { }
}
答案 0 :(得分:5)
后者更好:它将避免掩盖最终抛出dy dispose
的异常。见article.
答案 1 :(得分:2)
这真的是一种风格问题,你希望保持db
的范围有多窄:
如果使用在try / catch块内,则db
变量只能在try部分中访问。
如果使用在try / catch块之外,它将在catch部分中可见。
无论如何,变量将被正确处理,因为using块相当于try / finally。
就我个人而言,我想知道为什么你需要在那里捕捉异常,以及你能用它们做什么。
答案 2 :(得分:1)
using
可以预测,try/catch
和Dispose
将在路径上全部调用。可预测地意味着控制始终从内部流动 - >外部范围(对于异常和正常流程返回)。
问题是:何时 catch 应该与Dispose
和 的关系执行 catch 是?对此的答案因代码而异,但如果需要访问db
则必须“内部”,如果代码作为 {{1>的一部分执行,则必须“在外部” *可能是异常的来源。
(另外,空的挡块是icky!我假设它们在那里“用于演示目的”。)
快乐的编码。
*请注意,外部捕获将捕获从using
或(如J.N.所指出的)new tsmtcowebEntities()
抛出的异常,如果存在的话。 (完全是另一个主题,如果它可以接受任何一个构造抛出异常;-)我更喜欢捕获尽可能接近源的异常并让异常我不知道如何处理“流失”未被捕获的某些顶级构造中的除外(例如事件处理程序)。
答案 3 :(得分:0)
我建议将try / catch放在using中,因为无论是否抛出异常,都应该处理Disposable实体容器的类型