【问题标题】:How to catch and log exception inside Using statement without using try-catch?如何在不使用 try-catch 的情况下在 Using 语句中捕获和记录异常?
【发布时间】:2024-04-25 20:30:01
【问题描述】:

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

  1. 是否可以在 using 语句中记录异常而不使用 在语句内部或外部使用 try-catch 块。如果 不是,那为什么它内置在语句中。

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

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

会变成

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

【问题讨论】:

  • using 不能转换为 try-catch,只能转换为 try-finally
  • “异常记录机制”不应该在“catch”中,而不是“finally”中吗?
  • 您的偏好从何而来?

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


【解决方案1】:

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

  • 它使代码难以阅读
  • 而且更难做对(唉,大多数人都做错了)
  • 经常被误用
  • 这表明你的方法做得太多了

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

我只会使用:

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

【讨论】:

    【解决方案2】:

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

    这样做的原因是无论是否抛出异常,资源都会被处理掉。资源处置是using语句的目的。

    正确的实现是:

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

    【讨论】:

      最近更新 更多