Вдогонку.
В принципе, можно сделать свой обработчик ошибок интерпретатора. Интерпретатор сообщает об ошибках два раза: один раз пишет сам, а другой раз прилетает сообщение от процесса 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}]}". Это прописывается где-то очень глубоко. В принципе, если есть желание, можно ее распарсить, перевести и напечатать в любом удобном виде, хотя, конечно, изврат.