Bagaimana cara menyelamatkan/menangkap file kesalahan penulisan: pengecualian pipa rusak (Errno)?

Program Crystal saya dikeluarkan ke STDOUT dan biasanya disalurkan ke pager seperti less. Ketika pengguna menghentikan less sebelum keluaran penuh dilihat, aplikasi mengalami crash dengan pengecualian berikut:

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

Saya belum dapat menemukan kelas Pengecualian yang dapat saya gunakan untuk menyelamatkan ini. Di Ruby, saya akan menggunakan Errno::EPIPE, tetapi Errno::EPIPE bukan subkelas Exception di Crystal.

Jika saya menyelamatkan Errno, pengecualian yang tidak tertangani akan hilang, tetapi sisanya tetap ada:

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

person taylorthurlow    schedule 06.06.2019    source sumber


Jawaban (1)


Ini hanyalah bug di versi saat ini, Anda menemukan https://github.com/crystal-lang/crystal/issues/7810

person Jonne Haß    schedule 06.06.2019
comment
Ah, entah kenapa aku melewatkan masalah itu. Terima kasih! - person taylorthurlow; 06.06.2019