以编程方式抑制C#中的异常

Mic*_*ern 1 c# exception-handling exception try-catch

我有以下try-catch语句,如果message属性在文本中包含"我的错误",我不想抛出异常.

我怎样才能在程序上实现这一目标?此外,这会被视为代码味吗?

try
{
}
catch(Exception e)
{
    if(e.Messages.Contains("My error"))
    {
       //want to display a friendly message and suppress the exception
    }
    else
    {
        throw e;
    }
}
Run Code Online (Sandbox Code Playgroud)

Cla*_*diu 14

您不应该根据错误测试捕获错误.您应该创建自己的异常类来扩展异常:

class MyErrorException : Exception { }
Run Code Online (Sandbox Code Playgroud)

扔掉并抓住那些.(请原谅我的语法,如果它错了,我有一段时间没有做过C#).

话虽如此,抛出和捕获自己的异常而不是传播它们是完全正常的,这就是你实际上应该如何进行异常处理.

  • 你(以及到目前为止所有其他的回答者)都假设他控制了抛出异常的代码.这绝对是这样吗? (2认同)

Jim*_*ner 11

你应该抓住你正在寻找的特定例外.坦率地说,这段代码令人震惊.你应该有......

public class MyCoolException : Exception {
    public MyCoolException(string msg) : base(msg) {}
}

public void MyCoolMethod() {
    // if bad things happen
    throw new MyCoolException("You did something wrong!");
}
Run Code Online (Sandbox Code Playgroud)

然后在你的代码中你可以像...一样使用它

try {
    MyCoolMethod();
} catch (MyCoolException e) {
    // do some stuff
}
Run Code Online (Sandbox Code Playgroud)


Yur*_*ich 7

您的代码会产生可维护性问题,因为简单的文本更改可能会产生奇怪的副作用 您可以拥有自己的异常类,该类继承自System.Exception.然后,如果您可以执行以下操作,而不是

try
{

}
catch(MyException myException) //or just catch(MyException)
{
    //display a friendly message
}
Run Code Online (Sandbox Code Playgroud)

你也不想这样做,throw e因为它不会保留Stack,只是throw;会这样做.

  • +1也用于调出`throw e`语句.重新抛出异常的正确方法就是`throw;`. (2认同)