Исключения - дифференцирование исключений, когда метод вызывает более одного - PullRequest
0 голосов
/ 16 января 2012

Я получил этот класс, который вызывает исключение того же типа, как мне перехватить это исключение и отобразить соответствующее сообщение об ошибке. Вот что я делаю сейчас.

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 ]

2 голосов
/ 16 января 2012

Ваш пример не оправдывает пользовательских исключений. Я говорю просто показать оригинальное сообщение.

Однако, если вы действительно хотите пойти по пути пользовательских исключений, тогда другой вариант - создать одно пользовательское исключение, которое принимает 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 голосов
/ 16 января 2012

Вы можете рассмотреть возможность создания разных типов исключений. Если вы хотите придерживаться типов исключений из библиотеки, ArgumentNullException будет уместно, если старый или новый пароль будет нулевым или пустым. В качестве альтернативы вы можете определить собственные типы исключений с более конкретной ошибкой (возможно, похожей на FaultExceptions в WCF) или включить идентификатор ресурса в свое пользовательское исключение (для обеспечения совместимости с I18N):

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

Затем используется так:

try { ... }
catch (ResourceableException e)
{
  messagebox.Show(ResourceManager.GetResource(e.ResourceKey));
}
1 голос
/ 16 января 2012

Вы можете создавать пользовательские исключения, например:

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
}

Таким образом, вы можете обрабатывать различные типы исключений по-разному.Надеюсь, это то, что вы искали.

...