Какое исключение следует бросить в предполагаемое недоступное место? - PullRequest
4 голосов
/ 12 марта 2012

Например,

switch (number)
{
    case 1: return DoOne();
    case 2: return DoTwo();
    case 3: return DoThree();
    case 4: return DoFour();

    default:
        throw new ???Exception("Unexpected number encountered.");
}

Ради этого вопроса, пожалуйста, примите:

  • number - это личное поле в классе

  • Это инвариант класса, который number всегда должен быть между 1 и 4; все остальное указывает на ошибку в этом классе. Другими словами, если сработало исключение, это никогда ошибка вызывающего, но всегда автор класса.

Какое правильное исключение выдается в этом случае?

Ответы [ 4 ]

3 голосов
/ 12 марта 2012

Отредактировано

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

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

Я не думаю, что вам следует делать что-то радикальное, например, выход из программы (как предложено в другом, теперь удаленном, ответе).Как автор класса, это не ваша ответственность.

Как автор программного обеспечения, использующего этот класс, я хотел бы получить возможность сообщить пользователю, что случилось что-то плохое, попытаться сохранить резервные копии, записать информацию, записать материал в базы данных ... вы получаетекартинка.

2 голосов
/ 12 марта 2012

Поскольку ошибка вызвана ошибочным состоянием, используйте InvalidOperationException.Если бы number был аргументом вызываемого метода, я бы бросил ArgumentException.

2 голосов
/ 12 марта 2012

В Java я бы использовал AssertionError .

0 голосов
/ 12 марта 2012

Я бы также поставил InvalidOperation и объяснил, что пошло не так.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...