Модуль Printexc
module Printexc: sig .. end
Средства для вывода исключений и проверки текущей стека вызовов.
type t = exn = ..
Тип значений исключений.
val to_string : exn -> string
Printexc.to_string e возвращает строковое представление исключения e.
val to_string_default : exn -> string
Printexc.to_string_default e возвращает строковое представление исключения e, игнорируя все зарегистрированные принтеры исключений.
- Since 4.09
val print : ('a -> 'b) -> 'a -> 'b
Printexc.print fn x применяет fn к x и возвращает результат. Если вычисление fn x вызывает исключение, имя исключения выводится в стандартный поток ошибок, и исключение снова поднимается. Типичное использование — перехватить и сообщить об исключениях, которые возникают при применении функции.
val catch : ('a -> 'b) -> 'a -> 'b
Printexc.catch fn x подобно Printexc.print, но завершает программу с кодом выхода 2 после вывода необработанного исключения. Эта функция устарела: система выполнения теперь способна выводить необработанные исключения так же точно, как и Printexc.catch. Кроме того, вызов Printexc.catch затрудняет отслеживание местоположения исключения с помощью отладчика или средства трассировки стека. Поэтому не используйте Printexc.catch в новом коде.
val print_backtrace : out_channel -> unit
Printexc.print_backtrace oc выводит трассировку исключения в канал вывода oc. Трассировка показывает места в программе, где возникло и где было распространено последнее возникшее исключение через вызовы функций.
Если вызов не находится внутри обработчика исключений, возвращаемая трассировка не определена. Если вызов происходит после некоторого кода обработки исключений (до обработчика или в условии when во время сопоставления обработчика исключений), трассировка может соответствовать более позднему исключению, чем то, которое обрабатывается.
- Since 3.11.0
val get_backtrace : unit -> string
Printexc.get_backtrace () возвращает строку, содержащую ту же трассировку исключения, что и Printexc.print_backtrace. Аналогичные ограничения по использованию, как у Printexc.print_backtrace.
- Since 3.11.0
val record_backtrace : bool -> unit
Printexc.record_backtrace b включает (если b = true) или выключает (если b = false) запись трассировок исключений. Изначально трассировки не записываются, если флаг b не задан программе через переменную OCAMLRUNPARAM.
- Since 3.11.0
val backtrace_status : unit -> bool
Printexc.backtrace_status() возвращает true, если трассировки исключений в настоящее время записываются, false, если нет.
- Since 3.11.0
val register_printer : (exn -> string option) -> unit
Printexc.register_printer fn регистрирует fn как принтер исключений. Принтер должен возвращать None или поднимать исключение, если он не знает, как преобразовать переданное исключение, и Some со строкой
ss, если может преобразовать исключение. Исключения, поднятые принтером, игнорируются.
При преобразовании исключения в строку принтеры вызываются в обратном порядке их регистрации, пока принтер не вернёт значение Some s (если такого принтера нет, среда выполнения использует универсальный принтер).
Используя этот механизм, следует учитывать, что трассировка исключения прикреплена к потоку, в котором оно было поднято, а не к самому исключению. Практически это означает, что код, связанный с fn, не должен использовать трассировку, если он сам поднял исключение ранее.
- Since 3.11.2
val use_printers : exn -> string option
Printexc.use_printers e возвращает None, если нет зарегистрированных принтеров, и Some s со строкой else в противном случае.
- Since 4.09
Необработанные трассировки
type raw_backtrace
Тип raw_backtrace хранит трассировку в низкоуровневом формате, который можно преобразовать в пригодную форму с помощью raw_backtrace_entries и backtrace_slots_of_raw_entry ниже.
Преобразование трассировок в backtrace_slot медленнее, чем захват трассировок. Если приложение обрабатывает много трассировок, может быть полезно использовать raw_backtrace для избежания или отсрочки преобразования.
Необработанные трассировки не могут быть переданы. Если вам нужна передача, вы должны использовать массив, возвращаемый функцией backtrace_slots следующего раздела.
- Since 4.01.0
type raw_backtrace_entry = private int
raw_backtrace_entry — элемент raw_backtrace.
Каждый raw_backtrace_entry — это неявное целое число, значение которого не сохраняется между разными программами или даже между различными запусками одной и той же бинарной программы.
raw_backtrace_entry можно преобразовать в пригодную форму, используя backtrace_slots_of_raw_entry ниже. Обратите внимание, что из-за инлайнинга одно raw_backtrace_entry может преобразовываться в несколько backtrace_slot.
Поскольку значения raw_backtrace_entry не сохраняются, они не могут быть переданы. Если они должны быть преобразованы, то преобразование должно быть выполнено процессом, который их сгенерировал.
Снова из-за инлайнинга может быть несколько различных значений raw_backtrace_entry, которые преобразуются в одинаковые backtrace_slot.
Однако, если два raw_backtrace_entry равны как целые числа, то они представляют те же самые backtrace_slot.
- Since 4.12.0
val raw_backtrace_entries : raw_backtrace -> raw_backtrace_entry array
- Since 4.12.0
val get_raw_backtrace : unit -> raw_backtrace
Printexc.get_raw_backtrace () возвращает ту же трассировку исключения, что и Printexc.print_backtrace, но в необработанном формате. Аналогичные ограничения по использованию, как у Printexc.print_backtrace.
- Since 4.01.0
val print_raw_backtrace : out_channel -> raw_backtrace -> unit
Вывести необработанную трассировку в том же формате, что и Printexc.print_backtrace.
- Since 4.01.0
val raw_backtrace_to_string : raw_backtrace -> string
Возвращает строку из необработанной трассировки в том же формате, что и Printexc.get_backtrace.
- Since 4.01.0
val raise_with_backtrace : exn -> raw_backtrace -> 'a
Повторно вызовите исключение, используя заданную raw_backtrace в качестве источника исключения.
- Since 4.05.0
Текущая стопка вызовов
val get_callstack : int -> raw_backtrace
Printexc.get_callstack n возвращает описание вершины стека вызовов в текущей точке программы (для текущего потока), с максимальным количеством n элементов. (Примечание: эта функция никак не связана с исключениями, несмотря на то, что она входит в модуль Printexc.)
- Since 4.01.0
Необработанные исключения
val default_uncaught_exception_handler : exn -> raw_backtrace -> unit
Printexc.default_uncaught_exception_handler выводит исключение и трассировку в стандартный поток ошибок.
- Since 4.11
val set_uncaught_exception_handler : (exn -> raw_backtrace -> unit) -> unit
Printexc.set_uncaught_exception_handler fn регистрирует fn в качестве обработчика необработанных исключений. По умолчанию используется Printexc.default_uncaught_exception_handler.
Обратите внимание, что при вызове fn все функции, зарегистрированные с помощью at_exit, уже были вызваны. Поэтому необходимо убедиться, что все каналы вывода fn, в которые записывается информация, были сброшены.
Также обратите внимание, что исключения, вызванные пользовательским кодом в интерактивной верхней части, не передаются в эту функцию, так как они перехватываются самой верхней частью.
Если fn вызывает исключение, оба исключения, переданные в fn и вызванные fn, будут выведены с соответствующей трассировкой.
- Since 4.02.0
Обработка информации о трассировке
Эти функции используются для обхода слотов необработанной трассировки и извлечения информации из них в удобном для программиста формате.
type backtrace_slot
Абстрактный тип backtrace_slot представляет собой отдельный слот трассировки.
- Since 4.02
val backtrace_slots : raw_backtrace -> backtrace_slot array option
Возвращает слоты необработанной трассировки или None, если ни один из них не содержит полезной информации.
В возвращаемом массиве слот с индексом 0 соответствует последнему вызову функции, поднятию исключения или примитивному вызову get_backtrace в трассировке.
Возможные причины возврата None следующие:
- ни один из слотов в трассировке не происходит из модулей, скомпилированных с информацией отладки (
-g) - программа — это программа байткода, которая не была связана с включенной информацией отладки (
ocamlc -g)
- Since 4.02.0
val backtrace_slots_of_raw_entry : raw_backtrace_entry -> backtrace_slot array option
Возвращает слоты одного отдельного элемента необработанной трассировки или None, если этот элемент не содержит информацию об отладке.
Слоты возвращаются в том же порядке, что и backtrace_slots: слот с индексом 0 — это последний вызов, поднятие исключения или примитив, а последующие слоты представляют вызывающие стороны.
- Since 4.12
type location = {
filename :
| |
line_number :
| |
start_char :
| |
end_char :
|
} Тип информации о местоположении, найденной в стеках вызовов. start_char и end_char представляют позиции относительно начала строки.
- Since 4.02
module Slot: sig .. end
Слотсы стека вызовов (сырые)
type raw_backtrace_slot
Этот тип используется для перебора слотов в стеке вызовов raw_backtrace. Для большинства целей, backtrace_slots_of_raw_entry использовать проще.
Как и raw_backtrace_entry, значения этого типа специфичны для процесса и ни в коем случае не должны передаваться, так как небезопасны в использовании (маршаллинг может не завершиться ошибкой, но размаршаллинг и использование результата приведет к неопределенному поведению).
Элементы этого типа могут сравниваться и хешироваться: если два элемента равны, то они представляют одно и то же местоположение в исходном коде (обратное не всегда верно при наличии встраивания, например).
- Since 4.02.0
val raw_backtrace_length : raw_backtrace -> int
raw_backtrace_length bckt возвращает количество слотов в стеке вызовов bckt.
- Since 4.02
val get_raw_backtrace_slot : raw_backtrace -> int -> raw_backtrace_slot
get_raw_backtrace_slot bckt pos возвращает слот под позицией pos в стеке вызовов bckt.
- Since 4.02
val convert_raw_backtrace_slot : raw_backtrace_slot -> backtrace_slot
Извлекает понятный пользователю backtrace_slot из низкоуровневого raw_backtrace_slot.
- Since 4.02
val get_raw_backtrace_next_slot : raw_backtrace_slot -> raw_backtrace_slot option
get_raw_backtrace_next_slot slot возвращает следующий вложенный слот, если такой есть.
Пример кода для перебора всех фреймов (вложенных и невложенных):
(* Iterate over inlined frames *)
let rec iter_raw_backtrace_slot f slot =
f slot;
match get_raw_backtrace_next_slot slot with
| None -> ()
| Some slot' -> iter_raw_backtrace_slot f slot'
(* Iterate over stack frames *)
let iter_raw_backtrace f bt =
for i = 0 to raw_backtrace_length bt - 1 do
iter_raw_backtrace_slot f (get_raw_backtrace_slot bt i)
done
- Since 4.04.0
Слоты исключений
val exn_slot_id : exn -> int
Printexc.exn_slot_id возвращает целое число, которое однозначно идентифицирует конструктор, используемый для создания значения исключения exn (в текущей среде выполнения).
- Since 4.02.0
val exn_slot_name : exn -> string
Printexc.exn_slot_name exn возвращает внутреннее имя конструктора, используемого для создания значения исключения exn.
- Since 4.02.0
© 1995-2022 INRIA.
https://v2.ocaml.org/releases/4.14/htmlman/libref/Printexc.html