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

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

try
    string keyboardInput = read()
    int number = int.parse(keyboardInput)
    //the conversion succeeds
    if(number >= 1000) 
        //That's not what I asked for. The message to display to the user
        //is already in the catch-block below.
        throw new NumberFormatException() //well, there IS something wrong with the number...
 catch(NumberFormatException ex)  //the user entered text
    print("Please enter a valid number below 1000.")

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

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

Я придумал несколько способов решить эту проблему. Для начала было бы лучше кинуть специальное исключение. Проблема, с которой я сталкиваюсь, заключается в том, что если я поймаю это локально, что делать с другим исключением? По сути, пользовательское исключение будет причиной для второго блока catch, в который также будет скопировано сообщение. Мое решение:

//number is wrong
throw new MyException()
catch(NumberFormatException ex) 
    throw new MyException()
catch(MyException ex) {
    print("Please enter...")

Значение имен исключений здесь все. Это применение заказных исключений широко распространено, но по существуя не сделал ничего отличного от первого способа: я заставил войти в блок catch, хотя и выдал пользовательское исключение, а не стандартно-библиотечный.

Тот же самый способ, применяемый для создания исключения в вызывающем методе (таким образом, не имея блока catch для пользовательского исключения), кажется, имеет больше смысла. Мой метод может дать сбой в техническидвух направлениях, но по существув одном: неправильном вводе данных пользователем. Следовательно, можно было бы написать UserInputExceptionи заставить метод выдать это. Новая проблема: что, если это основнойметод приложения?

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

Как лучше всего подойти к этому?

6
задан MarioDS 17 January 2013 в 12:37
поделиться