我有以下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;
}
}
答案 0 :(得分:14)
您不应该根据错误测试捕获错误。您应该创建自己的异常类来扩展异常:
class MyErrorException : Exception { }
投掷并抓住那些。 (请原谅我的语法,如果它错了,我有一段时间没有做过C#。)
话虽如此,投掷和捕获自己的异常而不是传播它们是完全正常的,这就是你实际上应该如何进行异常处理。
答案 1 :(得分: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!");
}
然后在您的代码中,您可以像...一样使用它。
try {
MyCoolMethod();
} catch (MyCoolException e) {
// do some stuff
}
答案 2 :(得分:7)
您的代码会产生可维护性问题,因为简单的文本更改可能会产生奇怪的副作用。您可以拥有自己的异常类,该类继承自System.Exception。然后,如果您可以执行以下操作,而不是:
try
{
}
catch(MyException myException) //or just catch(MyException)
{
//display a friendly message
}
你也不想throw e
,因为它不会保留堆栈,只有throw;
会这样做。
答案 3 :(得分:0)
当我抛出异常而不是派生类时,我总是意味着一个失败的断言。我不喜欢在后端失败,因为我们仍然能够收到请求(只是不再那个)。如果我们真的敬酒,那么无论如何都会在下一个请求中出错。
当后端需要生成错误消息时,我有一个继承自Exception的ErrorMessage类,并将ErrorMessage和ErrorMessageTitle作为构造函数参数。