Учитывая метод, который может давать сбой с предупреждениями и / или ошибками, я хочу, чтобы метод ошибок отображался у вызывающей стороны. Например, этот скрипт:
foo(0); # line 1
sub foo {
1 / shift; # line 4
}
выдает ошибку Illegal division by zero at foo.pl line 4
, но я хочу Illegal division by zero at foo.pl line 1
. Должно быть несколько способов, если я помещаю метод в модуль или если я обертываю тело метода в eval, но я не нашел такого простого способа, как этот:
sub foo {
attributeErrorsToCaller; # do some magic
1 / shift;
}
Есть ли такой способ?
РЕДАКТИРОВАТЬ: ответ Мирод подходит не то, что я искал:
Foo::foo(0); # line 1
package Foo;
use diagnostics -traceonly;
BEGIN { disable diagnostics; }
sub foo {
enable diagnostics;
1 / shift; # line 9
}
Без enable diagnostics
сообщение об ошибке Illegal division by zero at foo.pl line 9.
. С enable diagnostics
это все еще слишком многословно, но это также может быть полезно:
Uncaught exception from user code:
Illegal division by zero at foo.pl line 10.
at foo.pl line 10
Foo::foo(0) called at foo.pl line 2
Бьюсь об заклад, я мог бы взломать диагностику , чтобы получить именно ту функцию, которую я хочу, но использование диагностики в качестве необработанного модуля, вероятно, более рекомендуется.