Does eval has the same features as Perl's?

Steven D'Aprano steve at REMOVE.THIS.cybersource.com.au
Sat Jan 20 05:45:32 EST 2007


On Sat, 20 Jan 2007 17:30:24 +0800, Jm lists wrote:

> Hello members,
> 
> I want to know does the "eval" in python have the same features as in
> Perl (capture errors)?
> 
> For example,in perl I can wrote:
> 
> $re = eval { 1 / 0 };
> 
> Though 1/0 is a fatal error but since it's in "eval" block so the perl
> interpreter doesn't get exit.

How hard would it be to actually try it?

>>> eval("1/0")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero

It took about three seconds to actually test it.

eval has many security risks -- as a rule, you should never pass strings
you've got from the user to eval, unless you want the user to p0wn your
computer. It is harder than you might think to make eval safe -- you
should seriously consider it an advanced tool, not a basic tool. As a
newbie, you should work under the following rule:

"If I think I need to use eval, I'm probably wrong."

I've been using Python for seven or eight years, and I don't think I've
ever used eval in serious code.

Now, suppose you find yourself wanting to use eval. You've considered the
above rule carefully, and decided that it doesn't apply in this case.
You've been careful to use it only on safe strings, not arbitrary strings
from users. How do you use eval so it captures errors?

try:
    eval("1/0")
except ZeroDivisionError: # capture only one error
    pass


or something like this:

try:
    eval("something or other goes here")
except Exception: # capture any error
    pass



-- 
Steven.




More information about the Python-list mailing list