когда я создаю пользовательский класс исключений, как я могу вызвать базовый конструктор с предоставленным аргументом?

#c# #exception

#c# #исключение

Вопрос:

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

»’

 class AccountException : Exception
{
    public string ACCOUNT_DOES_NOT_EXIST;
    public string CREDIT_LIMIT_HAS_BEEN_EXCEEDED;
    public string NAME_NOT_ASSOCIATED_WITH_ACCOUNT;
    public string NO_OVERDRAFT;
    public string PASSWORD_INCORRECT;
    public string USER_DOES_NOT_EXIST;
    public string USER_NOT_LOGGED_IN;

    public AccountException() : base()
    {
    }
    public AccountException(string type) : base()
    {   
      // what should I do
    }
}

    public void Login(string password)
    {
        try
        {
            if (Convert.ToString(password.GetHashCode()) == this.password)
            {
                IsAuthenticated = true;
            }
            else if (Convert.ToString(password.GetHashCode()) != this.password)
            {
                throw new AccountException("PASSWORD_INCORRECT");
            }
        }
        catch(AccountException e)
        {
            Console.WriteLine(e.Message);
        }
       
    }
  

»’

Комментарии:

1. Вы хотите получить исключение с сообщением «PASSWORD_INCORRECT «, когда ваша программа выдает ваш AccountException("PASSWORD_INCORRECT") ?

2. Да, это именно то, что я хочу

3. хорошо, итак, вы можете попробовать решение ниже 🙂

Ответ №1:

Если вы хотите получить класс исключений, который возвращает ваше сообщение (например, «PASSWORD_INCORRECT»), вы можете вызвать базовый конструктор с параметром message следующим образом:

 public AccountException(string message) : base(message)
{
}
  

ПРИМЕЧАНИЕ: если я могу дать вам предложение, не используйте много строковых атрибутов, таких как:

 public string ACCOUNT_DOES_NOT_EXIST;
public string CREDIT_LIMIT_HAS_BEEN_EXCEEDED;
public string NAME_NOT_ASSOCIATED_WITH_ACCOUNT;
public string NO_OVERDRAFT;
public string PASSWORD_INCORRECT;
public string USER_DOES_NOT_EXIST;
public string USER_NOT_LOGGED_IN;
  

Вместо этого создайте перечисление со всей доступной строкой, например:

 class AccountException: Exception
{

    public AccountException() : base()
    {
    }
    public AccountException(AccountExceptionMessages message) : base(message.ToString())
    {
    }
}

public void Login(string password)
{
    try
    {
        if (Convert.ToString(password.GetHashCode()) == this.password)
        {
            IsAuthenticated = true;
        }
        else if (Convert.ToString(password.GetHashCode()) != this.password)
        {
            throw new AccountException(AccountExceptionMessages.PASSWORD_INCORRECT);
        }
    }
    catch(AccountException e)
    {
        Console.WriteLine(e.Message);
    }
   
}

public enum AccountExceptionMessages
{
  
    ACCOUNT_DOES_NOT_EXIST = 0,
    CREDIT_LIMIT_HAS_BEEN_EXCEEDED = 1,
    NAME_NOT_ASSOCIATED_WITH_ACCOUNT = 2,
    NO_OVERDRAFT = 3,
    PASSWORD_INCORRECT = 4,
    USER_DOES_NOT_EXIST = 5,
    USER_NOT_LOGGED_IN = 6,
}