2015-09-06 3 views
1

Я просто пытаюсь получить более подробную информацию о том, как работают Исключения. Из MSDN страницы ArgumentOutOfRangeException Constructor (String) я нахожу записку: «Этот конструктор инициализирует свойство ParamName нового экземпляра с помощью параметра ParamName Содержание ParamName предназначено быть понятым людьмиОпределение конструктора ArgumentOutOfRangeException (String)

Что это означает? Обязательно, чтобы строковый ввод ArgumentException всегда соответствовал имени ввода определения метода? (т. Е. Двойное количество -> «сумма»)

Если это необходимо, было бы нелегко для обслуживания, что строка должна быть автоматически обновлена ​​каким-либо образом, если метод ввода аргументов изменил имена?

Из MSDN модульного тестирования урока мы имеем следующий код:

 public void Debit(double amount) 
    { 
     if (m_frozen) 
     { 
      throw new Exception("Account frozen"); 
     } 

     if (amount > m_balance) 
     { 
      throw new ArgumentOutOfRangeException("amount"); 
      //throw new ArgumentOutOfRangeException("whatever"); <-- this is my comment 
      //throw new ArgumentOutOfRangeException("what is the point?"); <-- this is my comment 
     } 

     if (amount < 0) 
     { 
      throw new ArgumentOutOfRangeException("amount"); 
     } 

     m_balance -= amount; 
    } 

ответ

2

Что это действительно означает?

Это означает, что параметр, передаваемый в качестве paramNameдолжно быть фактический параметр, который вызвал исключение. Зачем? Потому что, если выбрано исключение, это означает, что ваша программа столкнулась с ошибкой, и это поможет узнать, какой параметр был вне диапазона.

Если это необходимо, было бы непросто поддерживать обслуживание, чтобы строка автоматически обновлялась, если определение метода изменилось?

Да, это определенно было бы. Именно поэтому C# 6 представил nameof operator:

public void Foo(int amount) 
{ 
    if (amount < balance) 
     throw new ArgumentOutOfRangeException(nameof(amount)); 
} 
2

Это означает именно то, что он говорит. Содержание должно пониматься человеком, который его читает, а не машиной. Итак, вы должны сделать что-то, что является описательным для проблемы (вероятно, аргумент , который был вне допустимого диапазона).

Это не является обязательным для paramName, чтобы соответствовать фактическому имени параметра метода, но это, вероятно, поможет тем, кто поддерживает ваш код.

+0

Итак, если в какой-то момент имя входного аргумента метода изменяется, лучшей практикой для сопровождающих является также обновить строку Исключения. Разве это не склонно к ошибкам? – TasGeorg

+0

Имеет смысл обновить строку, и да, это может быть подвержено ошибкам. В C# 6 для этой цели был добавлен оператор 'nameof'. Вы можете использовать его как в 'nameof (amount)'. –

0

Чтобы просто и четко ответить на ваш вопрос, нет, это не имеет значения, если вы передадите этот аргумент. вы просто передать его здесь:

void SomeMethod(/*someParameters*/) 
{ 
    ... 
    throw new ArgumentOutOfRangeException("your desired name"); 
    ... 
} 

и использовать его как:

try 
{ 
    ... 
    SomeMethod(...); 
    ... 
} 
catch(ArgumentOutOfRangeException exception) 
{ 
    use exception.ParamName 
} 

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

Смежные вопросы