Re[4]: Про сообщения об ошибках интерпретатора Эрлэнга
От: faulx  
Дата: 17.10.06 18:47
Оценка: :)
Вдогонку.

В принципе, можно сделать свой обработчик ошибок интерпретатора. Интерпретатор сообщает об ошибках два раза: один раз пишет сам, а другой раз прилетает сообщение от процесса error_logger. Так вот, этому error_logger-у можно поставить свой обработчик, в котором можно делать все, что угодно. Т.е., создаем модуль my_handler.erl

-module(my_handler).
-behaviour(gen_event).

-export([start/0, stop/0]).
-export([report/1]).
-export([init/1, handle_event/2, terminate/2]).

start() ->
    error_logger:add_report_handler(my_handler).

stop() ->
    error_logger:delete_report_handler(my_handler).

report(MyError) ->
    error_logger:error_report(my_error, MyError).

init(_Arg) ->
    {ok, []}.

handle_event({error, Gleader, {Pid, Format, Data}}, State) ->
    io:format("==PREVED=======~n", []),
    io:format("По Эрлангу - низач0т!~n"),
    {ok, State};
handle_event(_Event, State) ->
    {ok, State}.

terminate(_Arg, _State) ->
    ok.


Теперь подключаем его: компилируем и вызваем my_handler:start(). Все, добавился еще один обработчик, и интерпретатор будет при ошибке писать то, что мы выводим в handle_event.

Здесь есть одна засада: информация об ошибке в переменной Data приходит уже в виде текстовой строки вида "Error in process <0.30.0> with exit value: {{badmatch,0},[{erl_eval,expr,3}]}". Это прописывается где-то очень глубоко. В принципе, если есть желание, можно ее распарсить, перевести и напечатать в любом удобном виде, хотя, конечно, изврат.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.