note
perrin
I wouldn't just go spreading FUD abour Error.pm. It has very serious problems, and the only reason I didn't describe them is that I thought they were well-known. The try/catch syntax is implemented using sub ref prototypes. Take a look at this code:
<CODE>
use Error qw( :try );
sub important_function {
try {
something_dangerous();
} catch Error::Simple with {
return 0;
};
return 1;
}
</CODE>
What value do you think this sub will return if it catches an error? It will always return 1, because the <CODE>return</CODE> inside of the catch block just returns from the implicit subroutine that the catch block creates. Nasty.<p>
Possibly worse, the nested closure problem can cause memory leaks in a long-running process. The problem is partially described by [Matts] [http://axkit.org/docs/presentations/tpc2001/exceptions.axp/a.pdf|in this presentation]. Here's an example of a sub that will leak memory every time you call it:
<CODE>
use Error qw( :try );
sub leaky_function {
my $foo = 7;
try {
# do something here
try {
$foo++;
} catch Error::Simple with {
# whatever
};
} catch Error::Simple with {
# whatever
};
}
</CODE>
I hope I've got this code right; it's been a while since I used it.<p>
<b>UPDATE:</b> This leak seems to have been fixed in recent versions of Perl. That's a nice thing to see!
<p>
We used Error in the system we built at eToys, and after having both of the problems I descibe here I have decided never to use the try/catch syntax again. It's dangerous and the problems are hard to see.
278619
278802