C# 使用&;尝试/捕捉嵌套

C# 使用&;尝试/捕捉嵌套,c#,try-catch,using-statement,C#,Try Catch,Using Statement,这个问题更多的是一个问题,什么是做某事的正确方式 问题是,using块和try/catch块之间是否有合适的嵌套顺序 使用语句将整个嵌套在try/catch中,并保持使用块的的优点,可以吗?(或者异常是否会导致using语句的结束部分被抛出窗口) 或者,您应该使用语句将try/catch嵌套在中,并仅围绕执行数据库访问的语句 是 试试看{ 使用(tsmtcowebEntities db=new tsmtcowebEntities()){ violationList=(来自db.DriverTra

这个问题更多的是一个问题,什么是做某事的正确方式

问题是,
using
块和
try/catch
块之间是否有合适的嵌套顺序

使用语句将整个
嵌套在
try/catch
中,并保持使用
块的
的优点,可以吗?(或者异常是否会导致using语句的结束部分被抛出窗口)

或者,您应该使用
语句将
try/catch
嵌套在
中,并仅围绕执行数据库访问的语句

试试看{
使用(tsmtcowebEntities db=new tsmtcowebEntities()){
violationList=(来自db.DriverTrafficViolationDetails中的a)
其中a.DriverTrafficViolation.DriverApplicationId==DriverApid
orderby a.DateOfOccurance降序
选择一个.ToList();
GeneralViolation=(来自db.driverTrafficVillations中的a)
其中a.DriverApplicationId==DriverAppId
选择一个.FirstOrDefault();
}
}捕获{}
比…更正确

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 { }
}
使用(tsmtcowebEntities db=new tsmtcowebEntities()){
试一试{
violationList=(来自db.DriverTrafficViolationDetails中的a)
其中a.DriverTrafficViolation.DriverApplicationId==DriverApid
orderby a.DateOfOccurance降序
选择一个.ToList();
GeneralViolation=(来自db.driverTrafficVillations中的a)
其中a.DriverApplicationId==DriverAppId
选择一个.FirstOrDefault();
}捕获{}
}

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

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

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

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

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


就我个人而言,我想知道为什么你需要捕捉异常,如果有的话,你能用它们做什么

后者更好:它将避免最终由
dispose
引发的屏蔽异常。请参见此

使用
嵌套,可预测地使用
try/catch
Dispose
将在路径上全部调用。可预测的意思是控制总是从内部->外部范围(对于异常和正常流返回)

问题是:什么时候应该执行与
Dispose
相关的catch,以及catch的范围应该是什么?此问题的答案因代码而异,但如果需要访问
db
,则答案显然必须是“在内部”,如果作为
的一部分使用
*执行的代码可能是异常的来源,则答案必须是“在外部”

(还有,空的挡块很恶心!我假设它们是“为了演示目的”而存在的。)

快乐编码



*请注意,外部捕获将捕获从
新tsmtcowebEntities()
或(正如J.N.所指出的)Dispose(如果存在)引发的异常。(如果任何一个构造都可以抛出异常,这完全是另一个话题;-)我更喜欢捕捉尽可能靠近源的异常,让我不知道如何处理“出血”的异常,除非在某些顶级构造中(例如事件处理程序)。

我想这是我问题的一部分。我100%肯定try/catch嵌套在using中的功能。我更不确定using语句是否可以处理相反的结果,并且仍然可以处理对象/资源。。。我有一些代码,我正在工作,它目前是双向的。我试图找出是否需要遍历代码并确保try/catch总是嵌套的。你已经证实了我最初的期望,所以我会接受答案@GlennFerrieLive
使用
进行自己的尝试捕捉。将始终调用
dispose
函数。无论嵌套情况如何,都将调用-1 dispose@Jared:using被编译成一个try finally(不是J.N.所说的try catch)。Dispose是在finally块中调用的,因此无论异常是否被捕获或处理,它都会被调用。。。您认为try-catch应该封装using块吗?@phoog?我给出了-1,因为您的答案意味着如果将using放在try-catch中,并且抛出异常,则不会调用Dispose。这是不正确的。您真的需要在提供的代码中包含应用程序的所有详细信息吗?我认为一个简单的虚构的例子就足够了。空的catch块是一个非常糟糕的编程实践。别这样!你以后会后悔的。@JonathonReinhart对我来说,复制和粘贴一段代码比编写一个示例要简单。当我觉得为全世界发布代码可能不好时,我就编写代码。在这种情况下,我看不到任何负面消息,那么为什么不呢?@phoog在我的代码中的大多数地方,我确实为EntityException放置了catch块,但我也使用Elmah记录了我的所有异常,因此无论我如何填写catch块,都会收到每个异常的通知。这可能不是正确的方法,但目前它对我很有效,如果我需要
Exception
没有提供的其他详细信息,我就进去添加它。在我的清单上,要做的是大量的代码重新分解,但是
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 { }
}