Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否有方法检测dispose中的异常?_C# - Fatal编程技术网

C# 是否有方法检测dispose中的异常?

C# 是否有方法检测dispose中的异常?,c#,C#,我有以下情况: class Program { static void Main(string[] args) { try { using (new Foo()) { throw new Exception("Inside using block"); } } catch (Exception e)

我有以下情况:

class Program
{
    static void Main(string[] args)
    {
        try
        {
            using (new Foo())
            {
                throw new Exception("Inside using block");
            }
        }
        catch (Exception e)
        {

        }
    }
}

public class Foo : IDisposable
{
    public void Dispose()
    {
        throw new Exception("Inside dispose");
    }
}
是否有可能在
Foo
Dispose
方法中获取抛出的异常-
“Inside using block”
,并使其成为
异常
Inside Dispose
内部异常

编辑:

例如:

class Program
{
    static void Main(string[] args)
    {
        try
        {
            using (var fi = new FileHandler())
            {
                //open the file
                fi.Open();

                //write to the file
                fi.Write();

                //excption occurs
                throw new Exception("Inside using block");

                fi.Close();
            }
        }
        catch (Exception e)
        {
            //now I only have the exception from the dispose but not the exception that occured in the using block itself
            //I know I could wrap the code inside the using in a try/catch itself, just asking if it is possible without 2 try/catches
        }
    }
}

public class FileHandler : IDisposable
{
    public void Dispose()
    {
        //Close the file
        //for some reason it fails with an exception
        throw new Exception("Inside dispose");
    }
}

根据框架设计指南(Cwalina,Abrams),第9.3节:

避免从Dispose(bool)内部引发异常,除非在包含进程已损坏的关键情况下

如果Dispose可能引发异常,则最终不会执行块清理逻辑。为了解决这个问题,用户需要将每个要Dispose的调用(在finally块中!)包装到try块中,这会导致非常复杂的清理处理程序。如果执行Dispose(bool)方法,如果disposing为false,则永远不要抛出异常

第9.3节:

避免使类型可终结。仔细考虑任何你认为需要终结器的情况。从性能和代码复杂性的角度来看,使用终结器的实例会带来实际成本。”


根据框架设计指南(Cwalina,Abrams),第9.3节:

避免从Dispose(bool)内部引发异常,除非在包含进程已损坏的关键情况下

如果Dispose可能引发异常,则不会执行进一步的finally块清理逻辑。要解决此问题,用户需要将每个Dispose调用(在其finally块内!)包装在一个try块中,这会导致非常复杂的清理处理程序。如果执行Dispose(bool)方法,则如果disposing为false,则永远不会引发异常

第9.3节:

避免使类型可终结。仔细考虑需要终结器的任何情况。从性能和代码复杂性的观点来看,与终结器相关联的实际成本是存在的。


你想干什么?这听起来像是一个X-Y问题。不,这是怎么回事?根据框架设计指南(Cwalina,Abrams),第9.3节:“避免从
Dispose(bool)中抛出异常”
除非在包含进程已损坏的关键情况下……如果
Dispose
可能引发异常,则不会执行进一步的finally块清理逻辑。要解决此问题,用户需要将对
Dispose
的每个调用都包装起来(在finally块内!)在一个try块中,这会导致非常复杂的清理处理程序。如果执行
Dispose(bool)
方法,如果
disposing
为false,则永远不要抛出异常。“@Amy如果这是一个答案,我将对此进行投票。@RandRandom也来自第9.3节:“避免使类型可终结。仔细考虑任何你认为需要终结器的情况。从性能和代码复杂性的角度来看,使用终结器的实例会带来实际成本。“你想做什么?这听起来像是一个X-Y问题。不,这是怎么回事?根据框架设计指南(Cwalina,Abrams),第9.3节:“避免从
Dispose(bool)中引发异常。”
包含进程已损坏的关键情况除外。。。如果
Dispose
可能引发异常,则最终不会执行块清理逻辑。为了解决这个问题,用户需要将对
Dispose
(在finally块中!)的每个调用包装在try块中,这会导致非常复杂的清理处理程序。如果执行
Dispose(bool)
方法,如果
disposing
为false,则永远不要抛出异常。“@Amy如果这是一个答案,我将对此进行投票。@RandRandom也来自第9.3节:“避免使类型可终结”。仔细考虑任何你认为需要终结器的情况。从性能和代码复杂性的角度来看,使用终结器的实例会带来实际成本。“我告诉过你…:-)@ZoharPeled我很抱歉怀疑你:)我告诉过你…:-)@ZoharPeled我很抱歉怀疑你:)