异常 - 当方法引发多个异常时区分异常

时间:2012-01-16 12:57:56

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

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

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")
}
...
}

3 个答案:

答案 0 :(得分:2)

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

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

然后像这样使用:

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

答案 1 :(得分:2)

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

但是,如果你真的想沿着自定义异常的路径前进,那么另一个选择就是创建一个自定义异常,它带有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
}

答案 2 :(得分:1)

您可以像这样创建自定义例外:

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
}

因此,您可以通过不同方式处理不同类型的异常。希望这就是你要找的东西。