From: nick on
I have a problem with catching my own exception. Here is the code:
http://fly.srk.fer.hr/~nick/travapi/blame.php?repname=Travian+API&path=%2Fvillage.py&

Line 252 calls a method, which on line 207 raises a
SomethingBeingBuiltError exception. On line 253 I catch that
exception, but when I run that code, I get:

Traceback (most recent call last):
File "village.py", line 252, in <module>
v.upgrade_cheapest()
File "/media/data/home/code/travapi/village.py", line 207, in upgrade_cheapest
raise SomethingBeingBuiltError()
village.SomethingBeingBuiltError: 'Unable to upgrade, check if something is being built.'

If I change line 253 to only "except:", everything works as
expected. How come? What am I missing? Any help would be appreciated.

P.S.: I'm aware I'm exposing my login/pass in the code. Don't care
really, those are throwaway accounts.

--
"Now the storm has passed over me
I'm left to drift on a dead calm sea
And watch her forever through the cracks in the beams
Nailed across the doorways of the bedrooms of my dreams"
From: Jon Clements on
On 18 June, 18:08, nick <nick-n...(a)net4u.hr> wrote:
> I have a problem with catching my own exception. Here is the code:http://fly.srk.fer.hr/~nick/travapi/blame.php?repname=Travian+API&pat...
>
> Line 252 calls a method, which on line 207 raises a
> SomethingBeingBuiltError exception. On line 253 I catch that
> exception, but when I run that code, I get:
>
> Traceback (most recent call last):
>   File "village.py", line 252, in <module>
>     v.upgrade_cheapest()
>   File "/media/data/home/code/travapi/village.py", line 207, in upgrade_cheapest
>     raise SomethingBeingBuiltError()
> village.SomethingBeingBuiltError: 'Unable to upgrade, check if something is being built.'
>
> If I change line 253 to only "except:", everything works as
> expected. How come? What am I missing? Any help would be appreciated.
>
> P.S.: I'm aware I'm exposing my login/pass in the code. Don't care
> really, those are throwaway accounts.
>
> --
> "Now the storm has passed over me
> I'm left to drift on a dead calm sea
> And watch her forever through the cracks in the beams
> Nailed across the doorways of the bedrooms of my dreams"

http://www.travian.com/spielregeln.php -- rule 3???
From: Steven D'Aprano on
On Fri, 18 Jun 2010 17:08:45 +0000, nick wrote:

> I have a problem with catching my own exception. Here is the code:
> http://fly.srk.fer.hr/~nick/travapi/blame.php?repname=Travian+API&path=%
2Fvillage.py&
>
> Line 252 calls a method, which on line 207 raises a
> SomethingBeingBuiltError exception. On line 253 I catch that exception,
> but when I run that code, I get:
>
> Traceback (most recent call last):
> File "village.py", line 252, in <module>
> v.upgrade_cheapest()
> File "/media/data/home/code/travapi/village.py", line 207, in
> upgrade_cheapest
> raise SomethingBeingBuiltError()
> village.SomethingBeingBuiltError: 'Unable to upgrade, check if something
> is being built.'
>
> If I change line 253 to only "except:", everything works as expected.
> How come? What am I missing? Any help would be appreciated.


I can't run your code, so I'm stuck with trying to guess how it works
just by reading it. As far as I can tell, it should work. If it doesn't
work, I can only imagine that you're not running the code you think you
are running. Perhaps you're running an older version?


Other than that, I notice that your module throws away useful debugging
information, and replaces it with bland, useless pap of no nutritional
value:

try:
import account, fetch, resources, const
except Exception:
raise Exception('One or more travapi modules not available.')

Instead of a useful ImportError exception that tells the caller two
important pieces of information (namely that it is an import error, and
what the error actually was) you replace it with a useless, generic
error. It might as well say "An error occurred" for all the use it is.

Errors should be *more* specific, not less. By replacing useful, specific
exceptions with the generic Exception class, you're throwing information
away and making your own job harder. Why would you rather see:

Exception: One or more travapi modules not available.

instead of this?

ImportError: No module named resources

As a general rule, anytime you find yourself writing:

except SomeSpecificException:
raise SomeOtherException

you should stop and think *really hard* about why you are bothering.



--
Steven
From: nick on
Dana Fri, 18 Jun 2010 10:36:21 -0700 (PDT),
Jon Clements <joncle(a)googlemail.com> kaze:
> http://www.travian.com/spielregeln.php -- rule 3???

Yeah, I know. If it's any consolation to you, I'm not doing it for the
fun of wining the game (hence not bothering to hide de code) but for
the fun of coding the API. :-)

Anyway, catching your own exceptions?

--
"Now the storm has passed over me
I'm left to drift on a dead calm sea
And watch her forever through the cracks in the beams
Nailed across the doorways of the bedrooms of my dreams"
From: Peter Otten on
nick wrote:

> I have a problem with catching my own exception. Here is the code:
>
http://fly.srk.fer.hr/~nick/travapi/blame.php?repname=Travian+API&path=%2Fvillage.py&
>
> Line 252 calls a method, which on line 207 raises a
> SomethingBeingBuiltError exception. On line 253 I catch that
> exception, but when I run that code, I get:
>
> Traceback (most recent call last):
> File "village.py", line 252, in <module>
> v.upgrade_cheapest()
> File "/media/data/home/code/travapi/village.py", line 207, in
> upgrade_cheapest
> raise SomethingBeingBuiltError()
> village.SomethingBeingBuiltError: 'Unable to upgrade, check if something
> is being built.'
>
> If I change line 253 to only "except:", everything works as
> expected. How come? What am I missing? Any help would be appreciated.
>
> P.S.: I'm aware I'm exposing my login/pass in the code. Don't care
> really, those are throwaway accounts.

You are importing your main script elswhere. Your code then
effectively becomes

try:
# in another module
raise village.SomethingBuiltError
except __main__.SomethingBeingBuiltError:
print "caught"

i. e. you get two versions of every class that are built from the same code
but not (recognized as) identical.

Solution: move your startup code into a separate file and have it import the
village module.

Peter