Это в основном функция того, как методы реализованы в Синатре. Методы, на которые мы должны обратить внимание: call!
, invoke
и dispatch!
, все методы в Sinatra :: Base (по состоянию на v1.3.2).
call!
- метод верхнего уровня, и там он вызывает следующую строку кода:
invoke { dispatch! }
Теперь invoke
выглядит так:
def invoke
res = catch(:halt) { yield }
res = [res] if Fixnum === res or String === res
if Array === res and Fixnum === res.first
status(res.shift)
body(res.pop)
headers(*res)
elsif res.respond_to? :each
body res
end
end
На самом деле он устанавливает код ответа на основе того, что вы throw
используете :halt
. И dispatch!
выглядит так:
def dispatch!
static! if settings.static? && (request.get? || request.head?)
filter! :before
route!
rescue ::Exception => boom
handle_exception!(boom)
ensure
filter! :after unless env['sinatra.static_file']
end
Видите этот ensure
блок? Это запускается как символ :halt
, который был thrown
, пропускает трассировку стека. Важно отметить, что это до кода настройки состояния.