Re[3]: Про сообщения об ошибках интерпретатора Эрлэнга
От: faulx  
Дата: 17.10.06 18:09
Оценка: 3 (1)
Можно, я встряну?

Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, Lazy Cjow Rhrr, Вы писали:


LCR>>Надеюсь что ты не об этом (здесь имхо всё прозрачно)

LCR>>./io_layer.erl:224: variable 'Insert' is unbound

VD>А как такое получить то? У меня что-то все второй вариант появляется.


Такое получается, когда ошибка компиляции. Страшное сообщение — когда ошибка выполнения.

LCR>>Сообщение об ошибке (точнее, код выхода (exit reason)) — это tagged терм. Соответственно все преимущества этого подхода налицо — возможность делать паттерн-матчинг, пересылать другим процессам и т.п, короче создавать функции принимающие этот терм в качестве аргумента.


VD>Зачем мне что-то делать с сообщением об ошибке? Мне нужно его прочесть и понять. Ну, еще неплохо было бы дабал-кликнув перейти к месту ошибке в исходном файле.


По сообщению об ошибке компиляции перейти можно (по крайней мере мой Емакс переходит). По сообщению времени исполнения перейти, естественно, труднее.

LCR>>Недостаток тоже на лицо — трудность восприятия. По крайней мере пока не появится навык видеть в этом терме смысл.


VD>На фиг такие навыки. Привыкая к маразму сам не заметишь как станешь маразматиком.


Теперь философия. Зачем нужно такое сообщение об ошибке? Дело в том, что одна из фишек Эрланга — это как раз обработка ошибок. Ошибок времени исполнения, разумеется. Когда вы вводите в интерпретаторе что-нибудь вроде
1=0.

происходит ошибка времени исполнения
{{badmatch,0},[{erl_eval,expr,3}]}

(В данном случае все просто. Произошла ошибка badmatch, т.е. ошибка сопоставления с образцом, 0 — это то значение, которое не было сопоставлено. Тут бы еще показать то с значение, с которым не сопоставлено, т.е. в данном случае, 1, но чего нет, того нет. Список [{erl_eval,expr,3}] — это стек вызовов, в данном случае, неглубокий.)

Идея в том, что этот терм (сообщение об ошибке + стек) можно перехватить в вашей же программе, обработать, скинуть в лог, отправить по почте — словом, обработать. И тут, согласитесь, чем больше информации, тем лучше.

Теперь об интерпретаторе. Конечно, можно было бы в интерпретаторе вместо сообщения {{badmatch,0},[{erl_eval,expr,3}]} поставить что-нибудь многословное, вежливо объясняющее, что же произошло. Но нужно ли это? Зачем вообще нужен интепретатор? Чтобы вычислить какое-нибудь выражение, вызвать функцию, и посмотреть, что будет. Вот оно нам честно и говорит, что будет. И ровно то же самое (с точностью до стека) будет и при выполнении программы. Так что всегда можно посмотреть, какая ошибка выдается при вычислении какого-либо выражения и знать, что будет при вычислении этого выражения в реальной работе, когда интерпретатора уже и рядом не будет.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.