【问题标题】:Exceptions - Differentiating Exceptions when method raises more than one异常 - 当方法引发多个异常时区分异常
【发布时间】:2012-02-11 09:57:09
【问题描述】:

我得到了这个引发相同类型异常的类,我如何捕获这个异常并显示适当的错误消息。这就是我现在要做的。

public bool ChangePassword(oldPassword,newPassword)
{

  if(oldPassword != savedInDatabase)
{
  throw new ArgumentException("Your old password is not same as one saved in our database")
}

  if(string.IsNullOrEmpty(oldPassword) || string.IsNullOrEmpty(newPassword))
{
 throw new ArgumentException("Your old or new password is empty of null");
}

}

我做下面的事情,

try
{
}
catch(ArgumentException ex)
{
 if(ex.Message.contains("Your old or"))
{
  messagebox.show("Either your old or new password is empty or null")
}
...
}

【问题讨论】:

  • 为什么不直接显示来自原始异常的消息?搜索这样的字符串通常是个坏主意。
  • @Oded 我可以,但是我如何识别ArgumentNullException 类型的其他异常。我认为更好的主意是使用友好的异常消息并显示它们。
  • @PeetBrits Why don't you just display the message from the original exception 这正是我现在的想法。只需使用友好的消息而不是检查字符串

标签: c# exception exception-handling error-code


【解决方案1】:

您可能会考虑抛出不同的异常类型。如果您希望坚持使用库异常类型,则在旧密码或新密码为空或空时,ArgumentNullException 将是合适的。或者,您可以考虑使用更具体的错误定义自己的异常类型(可能类似于 WCF 中的 FaultExceptions),或者在自定义异常中包含资源标识符(以确保 I18N 兼容):

public class ResourceableException : Exception
{
  public string ResourceKey { get;set; }
}

然后像这样使用:

try { ... }
catch (ResourceableException e)
{
  messagebox.Show(ResourceManager.GetResource(e.ResourceKey));
}

【讨论】:

  • 对于参数异常之类的事情,这不是有点过头了吗?
【解决方案2】:

您可以像这样创建自定义异常:

public class PasswordEmptyOrNullException : Exception
{
    public PasswordEmptyOrNullException(string message)
        : base(message)
    {

    }
}

public class OldPasswordNotFoundException : Exception
{
    public OldPasswordNotFoundException(string message)
        : base(message)
    {

    }
}

然后可以像这样使用它们:

throw new PasswordEmptyOrNullException("A message");

然后你可以像这样在 try catch 语句中处理它们:

try
{
}
catch (PasswordEmptyOrNullException ex)
{
    // Do stuff
}
catch (OldPasswordNotFoundException ex)
{
    // Do stuff
}

因此您可以以不同的方式处理不同类型的异常。希望这就是您想要的。

【讨论】:

    【解决方案3】:

    您的示例并不能真正证明自定义异常是合理的。我说只显示原始消息。

    但是,如果您真的想走自定义异常的道路,那么另一种选择是创建一个自定义异常,该异常采用具有所有不同选项的 enum,如下所示:

    public class PasswordException : Exception
    {
        public PasswordException(PasswordResult result) : base() { }
        public PasswordException(PasswordResult result, string message) : base(message) { }
        public PasswordException(PasswordResult result, string message, Exception innerException) : base(message, innerException) { }
    }
    
    public enum PasswordResult
    {
        Success = 0,
        PasswordMismatch,
        PasswordEmpty,
        // and so forth
    }
    

    【讨论】:

    • 或者让方法返回那个枚举。
    • @Hans,是的,甚至是黄油,但这取决于他的情况(例如,他是否使用了可能会忽略返回值的服务?)
    猜你喜欢
    • 1970-01-01
    • 2021-12-12
    • 2020-02-07
    • 1970-01-01
    • 2011-09-10
    • 2012-02-21
    • 2014-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多