如何在不使用try-catch的情况下捕获并记录Using语句中的异常?

时间:2013-07-11 08:55:20

标签: c# .net exception-handling try-catch using

据我所知,Using语句内置了Dispose()和Try-Catch的实现。所以我想知道一些事情

  1. 是否可以在不使用语句的情况下记录异常 在语句内部或外部使用try-catch块。如果 不,那么为什么它内置于声明中。

  2. 嵌套或过度使用try-catch不是首选,那么为什么会这样的模型 首选使用。

            using (some_resource)
            {
                try
                {
                }
                catch
                {
                }
                finally
                {
                    //my exception logging mechanism
                }
            }
    
  3. 将成为

                try
                {
                    try
                    {
                    }
                    catch
                    {
                    }
                    finally
                    {
                        //my exception logging mechanism
                    }
                }
                catch
                {
                }
                finally
                {
                    //some_resource.Dispose()
                }
    

2 个答案:

答案 0 :(得分:5)

using声明涉及try / finally;没有catch。但坦率地说,你的担忧是过度的;多重嵌套和复杂的try / catch / finally是“不受欢迎的”,因为:

  • 使代码难以阅读
  • 甚至更难做到(大多数人弄错了,唉)
  • 经常被滥用
  • 它表明你的方法做得太多了

使用using,这不是问题;它使意图非常干净,而不会增加复杂性或担忧。

我会用:

using (some_resource) {
    try {
        // some code
    } catch (Exception ex) {
        LogIt(ex);
        throw;
    }
}

答案 1 :(得分:1)

使用compiles尝试{}最后{}。请参阅以下问题:Does a C# using statement perform try/finally?

这样做的原因是无论是否抛出异常,资源都将被处置掉。资源处置是使用声明的目的。

正确的实施是:

using(Resource myresource = GetResource())
{
    try
    {}
    catch(Exception e)
    { //Maybe log the exception here when it happens?
    }
}