Прежде всего, я знаю, что стандартный ответ будет заключаться в том, что исключения для управления потоком никогда не используются. Хотя я совершенно согласен с этим, я думал долго о чем-то я иногда делал, что я опишу в следующем псевдокоде:Выбросьте лишнее исключение, чтобы избежать дублирования кода
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.")
Прежде всего, взять этот пример в очень абстрактным способом. Это не обязательно должно произойти. Ситуация просто:
входПользователь должен быть ограничен и может пойти не так в 2 способами, либо на брошенной исключением языка определяет, или чеком. Обе ошибки сообщаются пользователем таким же образом, потому что им не нужно знать техническую разницу в том, что вызвало это.
Я подумал о нескольких способах его решения. Начнем с того, что было бы лучше бросить сделанное на заказ исключение. Проблема, с которой я сталкиваюсь, заключается в том, что если я поймаю ее локально, что делать с другим исключением? Вследствие этого пользовательское исключение было бы причиной второго блока catch, в котором сообщение было бы скопировано так же хорошо. Мое решение:
//number is wrong
throw new MyException()
catch(NumberFormatException ex)
throw new MyException()
catch(MyException ex) {
print("Please enter...")
Значение имен исключений - все это здесь. Это приложение специально сделанных исключений является общепринятым, но по существу Я не делал ничего, что отличалось от первого способа: я вынужден зайти в блокировку, хотя и выбрасывая обычное исключение, а не стандартную библиотеку ,
Точно так же применяется для исключения исключения для вызывающего метода (при этом не имеет блока catch для настраиваемого исключения), кажется, имеет больше смысла. Мой метод может пойти не так, как технически двумя способами, но по существу в одну сторону: неправильный ввод пользователя. Поэтому следует написать UserInputException
и сделать способ бросить это. Новая проблема: что, если это основной метод приложения?
В настоящее время я не борюсь с конкретным приложением для реализации такого поведения, мой вопрос чисто теоретический и неязычный специфический.
Каков наилучший способ приблизиться к этому?
Я считаю, что несколько языков используют исключения как ядро многих своих структур управления потоком - я думаю, что python по-прежнему использует его для своих итераторных циклов foreach. Поэтому «исключения не используются для контроля потока». кажется немного сильным для меня ... –