По умолчанию исключение Failure
печатается следующим образом:
# print_endline (Printexc.to_string (Failure "uh\noh"));;
Failure("uh\noh")
Для улучшения читаемости мы хотим напечатать аргумент Failure
как есть, потому что мы понимаем, что он должен быть читаемым человеком,В стандартной библиотеке OCaml мы инициализируем приложение следующим образом:
# Printexc.register_printer (function
| Failure s -> Some ("Failure: " ^ s)
| _ -> None
);;
Новое поведение Printexc.to_string
будет:
# print_endline (Printexc.to_string (Failure "uh\noh"));;
Failure: uh
oh
Отлично.Теперь, если мы используем библиотеку core_kernel, сначала мы увидим, что печать исключения немного отличается, но не лучше для читателя-человека:
#require "core_kernel";;
# print_endline (Printexc.to_string (Failure "uh\noh"));;
(Failure "uh\
\noh")
Возможно, мы сможем переопределить это?Давайте попробуем.
# Printexc.register_printer (function
| Failure s -> Some ("Failure: " ^ s)
| _ -> None
);;
# print_endline (Printexc.to_string (Failure "uh\noh"));;
Failure: uh
oh
Это работает, но он не использует принтер, который является частью Core_kernel
.Если мы его используем, мы все равно получим тот же нечитаемый результат:
# print_endline (Core_kernel.Exn.to_string (Failure "uh\noh"));;
(Failure "uh\
\noh")
И Core_kernel.Exn
не предлагает функцию register_printer
.Таким образом, похоже, что Core_kernel.Exn
гарантирует, что мы не определяем настраиваемые принтеры исключений.Есть ли другой способ или мы просто не должны использовать Core_kernel.Exn
, тогда, если мы хотим показать удобочитаемые сообщения об ошибках?
Редактировать: Для контекста, наша первоначальная проблема - красиво распечатать вложенные сообщения об ошибках.Например, мы хотели бы прочитать что-то вроде следующего:
Uncaught exception: Failure:
Uncaught exception in subprocess 1234: Failure:
something happened
trace line 1
trace line 2
trace line 1
trace line 2
trace line 3
, где мы используем отступ для кавычек и экранирования, а не двойные кавычки и escape-последовательности обратной косой черты.