Обработка ошибок в Perl | Participants
|
- Statistics
- Participants
- Translate into Russian
- Translation result
- 78% translated in draft. Almost done, let's finish it!
If you do not want to register an account, you can sign in with OpenID.
Perl error handling | ||
Perl error handling | ||
Exception handling in Perl is a bit different than we are probably used to, particularly Perl has no try/catch/throw as some other languages, but that doesn't mean that it can't do exception handling, Perl can catch and handle exceptions as well as any other language but it has a slightly different structure. | Обработка исключений в Perl немного отличается от того, чем мы, вероятно, пользовались ранее, в частности, в Perl нет try/catch/throw, как в некоторых других языках. Однако это не означает, что обработка исключений в Perl невозможна, он может ловить и обрабатывать исключения, так же, как и любой другой язык, но делает это он несколько иным образом. | |
Exception handling in Perl is based on the use of the eval operator, which allows the evaluation of code and error catching, when eval receives a string, it compiles the code inside it and executes it, however any error that happens in the code, from the compilation to execution would abort the only the eval while our program will continue its execution, for example: | Обработка исключений в Perl основана на использовании оператора eval, который позволяет выполнить код и отловить возникшие ошибки. Полученную строку eval рассматривает как выражение языка: он компилирует код, содержащийся в этой строке, и выполняет его. При этом любые ошибки, возникшие как на этапе компиляции, так и на этапе выполнения, прервут только исполнение оператора eval, дальнейшее же исполнение программы будет продолжено. Например: | — Скорее всего, "Когда eval получает строку, он компилирует код из неё и исполняет его, однако, любые ошибки встретившиеся в коде, как при компиляции, так и при выполнении, прервут только eval, а наша программа продолжит выполняться." Так хорошо? — dayfuaim |
use Modern::Perl; | ||
my $result = eval( "5 / 0" ); | ||
say "El resultado es: $result"; | ||
Although the program works, the result of eval is undef, because division by zero prevented the return of any value, this also causes a warning on line 3 about the use of an uninitialized value. | Хотя эта программа срабатывает, eval() вернет undef, поскольку деление на ноль помешало возвращению какого либо значения, это также вызывает предупреждение в строке 3 об использовании неинициализированного значения. | — Может, программа "работает"? — dayfuaim |
What we need to know is whether the eval was successful or not, and that information is in the special variable $@ (also known as $EVAL_ERROR if we use the module English). | Все что нам нужно знать, была ли успешной операция eval(), а информацию об этом можно найти в специальной перменной $@ (другое название перменной - $EVAL_ERROR, доступно для использования если загружен модуль English). | — насколько я понимаю только из $@ можно узнать и если операция была успешной: из perldoc'а для eval: "... the value returned is the value of the last expression evaluated inside the mini-program... (а оно ведь тоже может быть undef) If there is a syntax error or runtime error, or ..., eval returns an undefined value ..., and $@ is set to the error message. If there was no error, $@ is guaranteed to be the empty string." — flamey |
use Modern::Perl; | ||
my $result = eval( "5 / 0" ); | ||
if ( $@ ) { | ||
say "Ooops: $@"; | — «Упс» — англоязычное междометие, по-русски будет «ой». — dionys | |
} | ||
else { | ||
say "El resultado es: $result"; | ||
} | ||
The problem with this solution is that the code within the string is not checked at compile time, because it is compiled at run time, and although this is extremely powerful, in most cases we are just interested in the eval's ability to catch errors, the second form of eval, takes a block of code that is checked during compilation of the program, and we can use it like this: | Проблема в таком подходе в том, что код внутри строки не проверяется во время компиляции, так как он будет скомпилирован во время выполнения. И, хотя это очень мощный способ, в большинстве случаев мы просто заинтересованы в способности eval(STRING) обнаруживать ошибки. Вторая форма eval{BLOCK} занимает блок кода, который проверяется на этапе компиляции программы, и мы можем использовать его так: | — Более по-русски, наверное, будет: "Вторая форма eval _принимает_ блок кода...". — dayfuaim |
my $result = eval { 5 / 0 }; | ||
In this form of eval, the braces ({}) mark the catch block where exception handling is required and returns the last expression of this block, or undef if an error occurs while executing it (because it has already been compiled altogether with the containing program). | В этой форме eval, фигурные скобки ({}) захватывают блок, где требуется обработка исключений и возвращает результат последнего выражения этого блока, или undef, если происходит ошибка при его выполнении (поскольку он уже был скомпилирован на момент компиляции самой программы). | |
The last primitive we need to complete Perl's exception system is die, which allows to throw an exception, this routine receives a value that is assigned to the variable $@, so we could make a program that throws an exception like this: | Завершает систему исключений Perl оператор die, который позволяет выбросить исключение. Этот оператор принимает в качестве параметра величину, которая будет присвоена переменной $@. Таким образом, программа, выбрасывающая исключение, выглядит следующим образом: | — Всё-таки, лучше "...вызвать исключение". — dayfuaim |

— Разбил длинное предложение на два. — dionys