代码之家  ›  专栏  ›  技术社区  ›  Michael Kniskern

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

  •  1
  • Michael Kniskern  · 技术社区  · 15 年前

    我有以下内容 try-catch 如果message属性在文本中包含“my error”,则不希望引发异常。

    我如何以编程方式完成这项工作?此外,这会被视为代码气味吗?

    try
    {
    }
    catch(Exception e)
    {
        if(e.Messages.Contains("My error"))
        {
           //want to display a friendly message and suppress the exception
        }
        else
        {
            throw e;
        }
    }
    
    4 回复  |  直到 15 年前
        1
  •  11
  •   Jim Mitchener    15 年前

    你应该注意到你正在寻找的特殊情况。坦率地说,这段代码令人震惊。你应该有…

    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
    }
    
        2
  •  14
  •   Dirk Vollmar    15 年前

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

    class MyErrorException : Exception { }
    

    投掷和接住。(请原谅我的语法错误,我有一段时间没做过C)。

    也就是说,抛出和捕获自己的异常而不是传播它们是完全正常的,这就是您实际应该如何处理异常的方法。

        3
  •  7
  •   Yuriy Faktorovich    15 年前

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

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

    你也不想这样做 throw e 因为它没有保留堆栈,只是 throw; 会的。

        4
  •  0
  •   Joshua    15 年前

    当我抛出异常而不是派生类时,我总是指失败的断言。我不喜欢失败的后端,因为我们仍然能够收到一个请求(只是不再是那个请求)。如果我们真的要干杯的话,下一个请求就会出错。

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