【问题标题】:Programmatically suppressing exceptions in C#以编程方式抑制 C# 中的异常
【发布时间】:2009-12-15 00:24:00
【问题描述】:

我有以下try-catch 语句,如果消息属性在文本中包含“我的错误”,我不想不抛出异常。

如何以编程方式完成此操作?另外,这会被认为是代码异味吗?

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

【问题讨论】:

  • 这是一种糟糕的代码气味。如果您出于某种原因不得不使用框架,那只会引发与您的代码相同类型的异常。但请注意,写throw e; 还是只写throw; 是有区别的(通常你会想要后者)。
  • 这很难闻的另一个原因:这种技术会阻止您将错误字符串本地化为其他语言。或者,如果您正在寻找其他人的错误字符串,他们可能会在下一个版本中更改该字符串,或者如果他们检测到用户是法国人,则使用不同的字符串,等等。
  • 是的,这实际上可能比前同事在一个重线程 Java 应用程序中将我所有的 catch (Exception e) 替换为 catch (Throwable t) 更糟糕。
  • @Eric 我曾经通过本地化正在搜索的字符串来做到这一点。仍然不是一个好主意。
  • 应该只是throw;,从不 throw e;。

标签: c# exception exception-handling try-catch


【解决方案1】:

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

class MyErrorException : Exception { }

然后扔掉并接住它们。 (请原谅我的语法错误,我已经有一段时间没有做 C#了)。

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

【讨论】:

  • +1 - 但这是 java 表示法,在 C# 中它是:class MyErrorException : System.Exception { }
  • Claudiu 是对的,永远不要看异常的消息,看看这是否正确。顺便说一下 Claudiu,正确的语法是派生类的冒号:class MyException : Exception { }。 `
  • 您(以及到目前为止的所有其他回答者)假设他控制着引发异常的代码。确定是这样吗?
  • @itowlson:为每种类型的错误抛出一个带有不同消息的一般异常是否是放弃外国图书馆的好理由?也许不是主要原因,但至少是反对使用它的一个缺点。
  • @itowlson:问题中的代码就是这样做的。我们只是在指出更好的方法。
【解决方案2】:

您应该捕捉到您正在寻找的特定异常。坦率地说,这段代码令人震惊。你应该有类似...

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

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

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

try {
    MyCoolMethod();
} catch (MyCoolException e) {
    // do some stuff
}

【讨论】:

  • +1 表示震惊。虽然,它真的不是,我已经看过太多次了,不再被它震惊了:)
【解决方案3】:

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

try
{

}
catch(MyException myException) //or just catch(MyException)
{
    //display a friendly message
}

您也不想使用throw e,因为它不会保留堆栈,只需throw; 即可。

【讨论】:

  • +1 用于调用 throw e 语句。重新抛出异常的正确方法是throw;。
【解决方案4】:

当我抛出异常而不是派生类时,我总是指一个失败的断言。我不喜欢后端失败,因为我们仍然能够收到请求(只是不再是那个请求)。如果我们真的很高兴,无论如何它只会在下一个请求时出错。

当后端需要生成错误消息时,我有一个继承自 Exception 并将 ErrorMessage 和 ErrorMessageTitle 作为构造函数参数的 ErrorMessage 类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多