Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.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# 我能否捕获特定或自定义异常?_C#_.net_Exception Handling - Fatal编程技术网

C# 我能否捕获特定或自定义异常?

C# 我能否捕获特定或自定义异常?,c#,.net,exception-handling,C#,.net,Exception Handling,我不想抓住一些例外。我能设法做到吗 我可以这样说吗: catch (Exception e BUT not CustomExceptionA) { } public void PreventExceptionsFor(Action actionToRun()) { try { actionToRun(); } catch {} } try { //lots of other stuff PreventExcepti

我不想抓住一些例外。我能设法做到吗

我可以这样说吗:

catch (Exception e BUT not CustomExceptionA)
{
}
public void PreventExceptionsFor(Action actionToRun())
{
    try
    {
         actionToRun();
    }
    catch
    {}
}
try
{
     //lots of other stuff
     PreventExceptionsFor(() => MethodThatCausesTheExceptionYouWantToIgnore());
     //other stuff
}
catch(Exception e)
{
    //do whatever
}

您可以对其进行过滤:

if (e is CustomExceptionA) throw;
当然,你可以抓住它并重新播放:

try
{
}
catch (CustomExceptionA) { throw; }
catch (Exception ex) { ... }

首先,除非您记录并重新抛出异常,否则捕获异常是不好的做法。但如果必须这样做,您需要捕获自定义异常并像这样重新抛出它:

try
{
}
catch (CustomExceptionA custome)
{
    throw custome;
}
catch (Exception e)
{
    // Do something that hopefully re-throw's e
}

在评论中接受@Servy的训练后,我想到了一个解决方案,可以让你做你想做的事情。让我们创建一个方法
IgnoreExceptionsFor()
,如下所示:

catch (Exception e BUT not CustomExceptionA)
{
}
public void PreventExceptionsFor(Action actionToRun())
{
    try
    {
         actionToRun();
    }
    catch
    {}
}
try
{
     //lots of other stuff
     PreventExceptionsFor(() => MethodThatCausesTheExceptionYouWantToIgnore());
     //other stuff
}
catch(Exception e)
{
    //do whatever
}
这可以这样称呼:

catch (Exception e BUT not CustomExceptionA)
{
}
public void PreventExceptionsFor(Action actionToRun())
{
    try
    {
         actionToRun();
    }
    catch
    {}
}
try
{
     //lots of other stuff
     PreventExceptionsFor(() => MethodThatCausesTheExceptionYouWantToIgnore());
     //other stuff
}
catch(Exception e)
{
    //do whatever
}
这样,除了带有
PreventExceptionsFor()
的那一行之外,每一行都会正常抛出异常,而
PreventExceptionsFor()
中的那一行会被悄悄地传递过来。

从C#6开始,您可以使用:


捕获并重新显示您的白名单异常?可能对您有帮助。
throw
而不是
throw e
将使堆栈跟踪保持不变。@DanielHilgarth Right,更改了它。但这取决于您想要什么IMHO。@Servy在我看来,OP希望忽略某些异常,并处理其他异常,代码将继续在被忽略的异常之后运行。其他一些人发布了将异常抛出到更高级别的方法,但没有一个实现该功能。如果OP想知道如何将异常重新引用到更高的级别,那么他似乎会这样问。请注意,
try
中的代码在异常被重试后将不会继续。OP询问了一种不捕获特定类型异常的方法。不捕获它的效果是重新抛出异常,直到它到达另一个try/catch块,而不是在抛出异常的点继续执行。他没有问如何防止异常首先被抛出。虽然从技术上讲,提供的解决方案确实捕获了自定义异常,但其效果是该异常似乎从未被捕获,因为它被重新抛出。@任何人想要重新抛出异常的唯一逻辑原因是在其他地方捕获它。如果他想在其他地方捕获它,他不会问如何不捕获异常。我猜他有一个异常,他希望抛出该异常,但是抛出的异常不一定会导致任何问题。可能类似于
var会话[“随便什么];如果(a==null)a=default(a)如果会话抛出一个nullref或其他什么,谁在乎呢,我们仍然希望得到默认值。我的答案是唯一允许这样做的。
任何人想要重新显示异常的唯一逻辑原因是在其他地方捕获它,否则这是一个致命的异常,应该会使应用程序崩溃。注意,他没有说任何暗示想要你要求的行为的话。如果那是他想要的,那么他就需要去要求。此外,您的答案不涉及不抛出异常,这似乎是您认为OP想要的。您的答案基本上是,“显式捕获除扩展
异常
的自定义异常之外的所有异常”。这不是一个特别实用的选项。@Servy如果问题是“如何捕获除某个异常之外的所有异常?”,我会说“捕获除自定义异常之外的所有异常”实际上看起来是一个很好的答案,不是吗?假设他正在处理一个致命的异常,你和我一样在猜测。那么,谁的答案更正确呢?我不知道,这取决于OP到底想要什么。不过,我的回答确实提供了不鼓励糟糕的编码实践的好处。例外情况(几乎)永远不应该被重新引用。最好是让他们冒着气泡到可以处理的地方。我必须说,你的解决方案比我的好!谢谢你。这显然是最好的办法。它不会像抛出
那样重击原始堆栈可以。