Estou escrevendo um script que pode sair normalmente em muitos pontos diferentes do programa. O script atualmente sempre emite uma mensagem para STDOUT em um bloco ensure, mais ou menos assim:
begin
exit
ensure
puts "my message"
end
O problema é que se o script travar, a mensagem é emitida de qualquer forma, seguida pelas mensagens de erro. O que eu quero fazer é somente emitir a mensagem em um exit 0, algo assim:
begin
exit 1
ensure
if is_this_a_normal_exit?()
puts 'my messsage'
end
end
Existe uma maneira de fazer isso?
Ao chamar
exit
, geralmente éKernel#exit
. Esse método basicamente lança umaSystemExit
exceção que pode eventualmente resultar na saída do programa.Você pode resgatar essa exceção ou verificá-la no bloco ensure:
Note que há outras causas possíveis para um programa ser encerrado, algumas das quais você não consegue capturar de forma alguma (por exemplo, ao chamar
Kernel#exit!
ou quando você ou algum outro processo envia um sinal comoSIGKILL
para matar seu programa). Além disso, ao usar threads, aSystemExit
exceção pode não ser propagada para a thread principal.