Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.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#6.0中使用异常过滤(使用typeof())与捕获自定义异常_C#_Exception_Exception Handling_C# 6.0_Custom Exceptions - Fatal编程技术网

在c#6.0中使用异常过滤(使用typeof())与捕获自定义异常

在c#6.0中使用异常过滤(使用typeof())与捕获自定义异常,c#,exception,exception-handling,c#-6.0,custom-exceptions,C#,Exception,Exception Handling,C# 6.0,Custom Exceptions,我有一个管理异常处理的方法,如下所示。问题是,如果异常的类型是我们的重点,建议采用哪种方法?使用 catch(System.Exception ex)when(ex.GetType()==typeof(exconexception)){…} 或 catch(ExcOneException ex){…} public T MyMethod<T>(Func<T> codeToExecute) { try { re

我有一个管理异常处理的方法,如下所示。问题是,如果异常的
类型是我们的重点,建议采用哪种方法?使用
catch(System.Exception ex)when(ex.GetType()==typeof(exconexception)){…}


catch(ExcOneException ex){…}

public T MyMethod<T>(Func<T> codeToExecute)
    {
        try
        {
            return codeToExecute.Invoke();
        }
        catch (System.Exception ex) when(ex.GetType() ==typeof(ExcOneException) )
        {
            throw new ExcOneException(ex.Message,ex);
        }
        catch (System.Exception ex)
        {
            throw new ExcTwoException(ex.Message, ex);
        }
    }  
public myt方法(Func code执行)
{
尝试
{
返回codeToExecute.Invoke();
}
当(例如GetType()==typeof(ExcOneException))时捕获(System.Exception)
{
抛出新的ExcOneException(例如Message,例如);
}
catch(System.Exception-ex)
{
抛出新的ExcTwoException(例如Message,ex);
}
}  

更新:我的解决方案有3个项目:UI、服务和数据访问。每个部分都有自己的自定义异常处理程序类。想象一下,所讨论的代码在服务项目中。所有代码都应该调用此方法执行。如果存在类型为ExcOneException的运行时错误,则表示该错误在服务部分,否则数据访问部分应该有错误;因此,应该抛出ExcTwoException。这种方法可以帮助我将错误冒泡到UI级别,并提供详细信息。我不知道的是,在我们可以使用C#6属性的情况下,当我只对异常类型进行过滤时,哪种方法更好,使用catch when或提及异常类型作为catch的参数 异常过滤器用于过滤您无法按类型捕获的异常,这不是您的情况

在代码中,您也不会重新抛出捕获的异常。您正在抛出一个新异常,其中捕获的异常作为内部异常,这是您在希望用更有意义的异常包装捕获的异常时所做的操作

如果您打算重新抛出,正确的代码是:

    catch (System.Exception ex)
    {
        throw;
    }

简化和可读性:

您可以使用
is
,而不是
typeof
,进行筛选:

catch (Exception ex) when (ex is ExcOneException) { ... }
链多个异常类型:

catch (Exception ex) when (ex is ExcOneException || ex is ExcTwoException) { ... }

为什么不在(ex是ExcOneException)时捕获(System.Exception ex)
?在任何情况下,您都应该执行
catch(ExcOneException ex){…}
。确切地说,我想知道在这种情况下,执行和性能是否有任何差异。例如,我知道,不建议使用if/else检查catch主体中的异常类型,因为堆栈缠绕和跟踪丢失。但我想确定上面提到的两种方法之间是否没有任何区别当异常已经是ExcOneException时。它重新创建堆栈跟踪。使用
throw正如保罗·莫尔加多建议的那样,这不会改变我的答案。我看不出对异常类型进行过滤有任何价值。@PauloMorgado是正确的,只是将异常返回到UI层不会重置堆栈跟踪,这是多层.NET应用程序的首选方法。