baffling error-handling problem

Scott David Daniels Scott.Daniels at Acm.Org
Thu Jul 28 18:11:02 CEST 2005


Chris Fonnesbeck wrote:
> I thought I knew how to do error handling in python, but apparently I
> dont. I have a bunch of code to calculate statistical likelihoods, and
> use error handling to catch invalid parameters. For example, for the
> bernoulli distribution, I have:
> 
>     def bernoulli_like(self, x, p, name='bernoulli'):
>         ... if sum(p>=1 or p<=0): raise LikelihoodError ...
> 
> where LikelihoodError is simply a subclass of ValueError that I created:
> 
>     class LikelihoodError(ValueError):
>         "Log-likelihood is invalid or negative infinite"
> 
> I catch these errors with the following:
> 
>         try: like = self.calculate_likelihood()
>         except LikelihoodError:
>             return 0
>
 > ... [when using] ...
>      like=self.bernoulli_like(x,p)
> 
> I get the following when an invalid parameter is passed:
> 
> Traceback (most recent call last):
>   File "...\model_000.py", line 381, in ?
>     model.sample(iterations=iter, burn=burn,plot=False)
>   File "...\PyMC\MCMC.py", line 1691, in sample
>     self._like = self.calculate_likelihood()
>   File "...\model_000.py", line 194, in calculate_likelihood
>     like+=self.bernoulli_like(x,p)
>   File "...\MCMC.py", line 868, in bernoulli_like
>     if sum(p>=1 or p<=0): raise LikelihoodError
> LikelihoodError
> 
> I have no idea how this can happen, given how I have coded this.

Might you be referring to a different LikelihoodError in the
   try: ... except ... part of your code than in the ... raise ... part?
Similarly defined classes are not the same class.  If you didn't
get LikelihoodError in mode4l_000.py with the moral equivalent of
      from MCMC import LikelihoodError
then this is what is going wrong.
By the way, if it were I, I'd:    raise LikelihoodError(p)  just so I
could discover a bit of what went wrong.

--Scott David Daniels
Scott.Daniels at Acm.Org



More information about the Python-list mailing list