Мой личный способ, который я не уверен, если это вообще рекомендуемый способ, - это проверять тип и делать другие проверки при возникновении ошибки.Я положил процедуру проверки типа в блоке спасения.Таким образом, я могу избежать потери производительности, когда заданы правильные аргументы, но по-прежнему возвращать правильное сообщение об ошибке при возникновении ошибки.
def foo arg1, arg2, arg3
...
main_routine
...
rescue
## check for type and other validations
raise "Expecting an array: #{arg1.inspect}" unless arg1.kind_of?(Array)
raise "The first argument must be of length 2: #{arg1.inspect}" unless arg1.length == 2
raise "Expecting a string: #{arg2.inspect}" unless arg2.kind_of?(String)
raise "The second argument must not be empty" if arg2.empty?
...
raise "This is `foo''s bug. Something unexpected happened: #{$!.message}"
end
Предположим, в main_routine
используется метод each
на arg1
при условии, что arg1
является массивом.Если окажется, что это что-то еще, для которого each
не определено, то пустое сообщение об ошибке будет выглядеть как method each not defined on ...
, что, с точки зрения пользователя метода foo
, может быть неполезно.В этом случае исходное сообщение об ошибке будет заменено сообщением Expecting an array: ...
, что гораздо полезнее.