Что-то, что указывает на ошибку программиста, например, неправильный тип аргумента, переданного методу, определенно вызывает исключение.Исключение приведет к падению программы, обратив внимание программиста на тот факт, что они используют ваш класс неправильно, чтобы они могли решить проблему.В этом случае возвращать код ошибки не имеет смысла, так как программе придется включать код для проверки возвращаемого значения, но после отладки программы таких ошибок быть не должно.
ВВаш WebCrawler
класс, является ли ожидаемым , что crawl
будет иногда получать неверный URL в качестве аргумента?Я думаю, что ответ, вероятно, нет.Таким образом, поднятие исключения будет целесообразно при передаче неверного URL.
Когда возникает исключение, поток выполнения неожиданно «переходит» к самому внутреннему обработчику.Это может быть полезным способом структурирования кода, когда исключение составляет , а не , которое, как ожидается, будет происходить большую часть времени, потому что вы можете написать «основной поток» вашего метода как простой, прямолинейный код без включениямного подробностей о том, что произойдет, когда возникнет редкая ошибка.Эти детали могут быть отделены от кода «основного потока» и помещены в обработчик исключений.Однако, когда ожидается, что в нормальных условиях возникнет ошибка, может быть лучше поместить код обработки ошибок в соответствие с «основным потоком», чтобы прояснить, что происходит.Если поток управления вашей программы «перепрыгивает» (как в случае, когда для нормального управления потоком используются исключения), это означает, что читатель также должен «перепрыгивать» в тексте программы, когда он выясняет, как она работает.
Что касается двух других, я думаю, что по крайней мере иногда HTTP-запрос будет возвращать код ошибки.Чтобы определить, является ли исключение или специальное возвращаемое значение лучшим способом указать такое условие, я бы подумал о как часто эти условия будут происходить при нормальном использовании.Подумайте также о том, как код клиента будет читаться в любом случае.Если вы используете исключения, они должны будут написать что-то вроде:
urls.map do |url|
begin
crawl(url)
rescue PageNotFoundError
""
rescue UnauthorizedError
""
end
end
(Кстати, я думаю, что этот пример кода что-то показывает: это может быть хорошей идеей, если оба ваших пользовательских исключения наследуются отобщий суперкласс, так что вы можете поймать их обоих при помощи одного предложения rescue
, если хотите.) Или, если вы используете коды ошибок, это будет выглядеть примерно так:
urls.map do |url|
response = crawl(url)
if [:page_not_found, :unauthorized].include? response
""
else
response
end
end
Что, по вашему мнению, читается лучше?Это действительно зависит от вас.Единственное, что вы хотите сделать , а не , это использовать целочисленные константы для ошибок.Зачем использовать целые числа?Когда вы печатаете их в трассировке отладки, вам нужно будет посмотреть список констант, чтобы увидеть, что означает каждая из них.И использование символов столь же эффективно в вычислительном отношении.