Моя программа Crystal выводит на STDOUT и, как правило, отправляется в пейджер, как less
. Когда пользователь завершает работу less
до просмотра полного вывода, происходит сбой приложения со следующим исключением:
Unhandled exception: Error writing file: Broken pipe (Errno)
from /usr/local/Cellar/crystal/0.28.0/src/crystal/system/unix/file_descriptor.cr:79:13 in 'unbuffered_write'
from /usr/local/Cellar/crystal/0.28.0/src/io/buffered.cr:179:5 in 'flush'
from /usr/local/Cellar/crystal/0.28.0/src/io/buffered.cr:131:7 in 'write'
from /usr/local/Cellar/crystal/0.28.0/src/io.cr:481:7 in 'write_utf8'
from /usr/local/Cellar/crystal/0.28.0/src/string.cr:4254:5 in 'to_s'
from /usr/local/Cellar/crystal/0.28.0/src/io.cr:184:5 in '<<'
from /usr/local/Cellar/crystal/0.28.0/src/io.cr:227:5 in 'puts'
from /usr/local/Cellar/crystal/0.28.0/src/kernel.cr:366:3 in 'puts'
from lib/log.cr:16:9 in 'print'
from src/thicket.cr:69:3 in '__crystal_main'
from /usr/local/Cellar/crystal/0.28.0/src/crystal/main.cr:97:5 in 'main_user_code'
from /usr/local/Cellar/crystal/0.28.0/src/crystal/main.cr:86:7 in 'main'
from /usr/local/Cellar/crystal/0.28.0/src/crystal/main.cr:106:3 in 'main'
Failed to raise an exception: END_OF_STACK
[0x1056c232b] *CallStack::print_backtrace:Int32 +107
[0x105692753] __crystal_raise +83
[0x1056ec7cb] *IO::FileDescriptor@Crystal::System::FileDescriptor#unbuffered_write<Slice(UInt8)>:Nil +203
[0x1056ec691] *IO::FileDescriptor@IO::Buffered#flush:IO::FileDescriptor +81
[0x10572899e] *Crystal::main<Int32, Pointer(Pointer(UInt8))>:Int32 +142
[0x10569cfb9] main +9
Мне не удалось найти класс Exception, который я могу использовать, чтобы спасти это. В Ruby я бы использовал Errno::EPIPE
, но Errno::EPIPE
не является подклассом Exception
в Crystal.
Если я спасу Errno
, необработанное исключение исчезнет, а остальное останется:
Failed to raise an exception: END_OF_STACK
[0x10d40910b] *CallStack::print_backtrace:Int32 +107
[0x10d3d9533] __crystal_raise +83
[0x10d4335ab] *IO::FileDescriptor@Crystal::System::FileDescriptor#unbuffered_write<Slice(UInt8)>:Nil +203
[0x10d433471] *IO::FileDescriptor@IO::Buffered#flush:IO::FileDescriptor +81
[0x10d46f8fe] *Crystal::main<Int32, Pointer(Pointer(UInt8))>:Int32 +142
[0x10d3e3d99] main +9