- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
package Exception;
sub new {
my($package, $what) = @_;
return bless { what => $what }, $package;
}
sub what {
my($self) = @_;
return $self->{what};
}
package main;
sub try(&$) {
my($code, $catch) = @_;
unless(eval { $code->(); 1 }) {
local $_ = $@;
$catch->();
}
}
sub catch(&) { $_[0] }
sub throw($) { die $_[0] }
try {
throw new Exception("Ошибка");
} catch {
print $_->what;
};
kainwinterheart 08.08.2013 12:43 # +1
http://search.cpan.org/~doy/Try-Tiny-0.16/lib/Try/Tiny.pm
http://search.cpan.org/~pjordan/Exception-1.7/Exception.pm
http://search.cpan.org/~drolsky/Exception-Class-1.37/lib/Exception/Class.pm
Тысячи их.
inb4 а изкоробочных - да, нету.
Dummy00001 08.08.2013 21:28 # 0
это слегка неправильно обобщение.
в перле нету штатного try/catch/finally *синтакса*.
но его можно самому реализовать.
все приведеное выше есть чистой воды syntax sugar вокруг `eval {};` (эквивалент `try {}`), `die $smth` (эквивалент `throw smth`) и `if ($@) {}` (эквивалент `catch (e) {}`).
причина почему не добавляют выделеный синтакс (по крайней мере причина которую я слышал много лет назад) заключается в том что `eval {}` очень медленный и как следствие эксепшены будут весьма заметно тормозить. (и в добавок, только недавно начали реализовывать переменные $@/$!/etc как thread-local. и я не уверен что закончили. в типичном перле это глобальные переменные.)
вообщем, в перле есть эксепшены, только у них слегка кривой синтакс потому что их реализовали более или менее случайно, и они не рекомендуются потому что подтормаживают (и не поддерживают многопоточность).
kainwinterheart 08.08.2013 22:46 # 0
Dummy00001 08.08.2013 22:58 # 0
Но то что занимает 30 строк кода на "реализовать самому" тоже не тянет.
Я давеча пулы к паре фактори в жабе прикручивал. Официально 0% "реализовал сам" - строго апачевы пулы, но ~200 кода понадобилось.
Как по мне, я предпочитаю 100% "сделай сам" в 30 строк, нежели чем 0% "сделай сам" но в 200 строк.
anonimb84a2f6fd141 09.08.2013 01:46 # 0
kainwinterheart 09.08.2013 09:34 # +1
- Предоставляются по умолчанию самим языком, или в виде библиотеки, созданной сторонними разработчиками?
Dummy00001 09.08.2013 13:14 # 0
kainwinterheart 09.08.2013 14:58 # 0
- Но не в языке ведь из коробки. :) Потому и ~200 строк кода. Потому что это "реализовать самому". А вот если бы оно было из коробки - было бы всё как надо.
Dummy00001 09.08.2013 15:21 # 0
Единственное что язык может сделать, это позволять расширения в (насколько только возможно) безболезненной и прозрачной форме.
roman-kashitsyn 09.08.2013 15:29 # 0
kainwinterheart 09.08.2013 17:42 # 0
В случае с перлом и исключениями - исключений из коробки в перле не появляется после создания расширения одним из потребителей языка. И изкоробочных исключений в перле всё ещё нет.
Понятно, что в перле самому реализовать исключения - раз плюнуть. И так же просто эту реализацию будет использовать. Но она всё равно получается не более, чем сторонней.
anonimb84a2f6fd141 09.08.2013 19:14 # 0
dionys 19.08.2013 09:16 # 0
anonimb84a2f6fd141 19.08.2013 19:49 # 0
dionys 19.08.2013 20:35 # 0
anonimb84a2f6fd141 19.08.2013 20:46 # −2
dionys 19.08.2013 21:16 # +1
anonimb84a2f6fd141 19.08.2013 21:32 # 0
dionys 19.08.2013 21:35 # +1
anonimb84a2f6fd141 19.08.2013 22:53 # −1
Перл был хорошим языком для того, для чего его задумали - парсинга stdin регулярками и вывода в stdout. Универсальный язык из него вышел вообще никакой.
dionys 19.08.2013 23:38 # +1
anonimb84a2f6fd141 20.08.2013 00:59 # 0
НЕ НУЖЕН
anonimb84a2f6fd141 20.08.2013 02:35 # 0
PERL скорее сделает невозможное, чем выдаст сообщение об ошибке. Ваша программа заработает сразу же и будет работать всегда, не вызывая сообщений об ошибках, только насколько правильно – это, как говорится, "тонкий философский вопрос". (Хотя это и к php подходит)
anonimb84a2f6fd141 20.08.2013 02:48 # −1
I_hate_PERL_-_what_a_tricky_language;
Секрет прост – слова, не поддающиеся никакой интерпретации, PERL считает строками, заключенными в кавычки, в результате чего получается выражение, а это уже допустимый оператор, о как! Таким образом можно, например, вызвать несуществующую процедуру, просто опечатавшись при наборе ее имени, и потратить много-много часов на отладку неработающего фрагмента – ведь вы не дождетесь от PERL сообщения об ошибке или хотя бы предупреждения ни на этапе компиляции, ни на этапе выполнения, так что ошибку придется искать самостоятельно.
dionys 20.08.2013 09:53 # +2
anonimb84a2f6fd141 20.08.2013 18:19 # −1
dionys 20.08.2013 09:47 # +1
anonimb84a2f6fd141 27.08.2013 13:43 # −1
anonimb84a2f6fd141 20.08.2013 02:52 # −1
dionys 20.08.2013 09:48 # +1
anonimb84a2f6fd141 20.08.2013 18:22 # −1
При чем тут мой код?
>Нормально написанный код на перле смотрится как говнокод!
dionys 20.08.2013 18:26 # +1
anonimb84a2f6fd141 20.08.2013 19:19 # −1
dionys 20.08.2013 19:22 # +1
dionys 19.08.2013 09:18 # +3
Dummy00001 19.08.2013 13:06 # 0
dionys 19.08.2013 13:34 # 0
Например:
Этот код показывает разницу в 20 раз на Perl 5.14. Однако, если мы добавим в процедуру простейшую арифметическую операцию с переменной, то разница сократится уже до 2-х раз.
Dummy00001 19.08.2013 14:18 # 0
с простой функцией разница меньше:
и на последок:
bormand 19.08.2013 15:20 # 0
Ну 20% потерь для такого простого тела это очень даже хорошо. На более-менее сложной функции станет совсем незаметно. А если там внутри этого eval'а какое-нибудь чтение файла, то и совсем в пределах погрешности.
А вот eval { 1 } и eval "1" бенчить глупо. Надо на чем-то более-менее реалистичном, чем возврат true. Тогда разница будет поменьше на порядки...
P.S. Это я все к чему - если юзать eval во внутренних циклах текстодробилки - да, тормозит. А если для обработки ошибок в каком-нибудь движке для сайта, то 146%, что никакой разницы никто не заметит.
> только недавно начали реализовывать переменные $@/$!/etc как thread-local
О_о. Т.е. сделали треды, но забыли сделать инфу об ошибках thread-local? Пиздец, приехали. Хотя и в libc когда-то такая же херня творилась с errno. Не учится автор пёрла на чужих ошибках ;)
anonimb84a2f6fd141 08.08.2013 18:03 # −4
someone 08.08.2013 18:49 # 0
gh0stwizard 08.08.2013 20:07 # 0
anonimb84a2f6fd141 08.08.2013 21:23 # −2
dionys 19.08.2013 09:19 # 0
an0nym 08.08.2013 22:52 # 0
Но если бы я запостил столько говна никто бы не стал разбираться.
guest 10.08.2013 03:08 # −9
guest 10.08.2013 14:25 # −9
an0nym 21.08.2013 18:30 # −1
guest 27.08.2013 11:24 # −13
Stertor 04.10.2013 16:25 # 0