[Python-Dev] What exception should Thread.start() raise?

Guido van Rossum guido at python.org
Mon Jun 4 22:33:11 CEST 2007


On 6/4/07, Steven Bethard <steven.bethard at gmail.com> wrote:
> On 6/4/07, BJörn Lindqvist <bjourne at gmail.com> wrote:
> > The threading module contains buggy code:
> >
> > class Thread(_Verbose):
> >     ...
> >     def start(self):
> >         assert self.__initialized, "Thread.__init__() not called"
> >         assert not self.__started, "thread already started"
> >     ...
> >
> > If you run such code with python -O, weird stuff may happen when you
> > call mythread.start() multiple times. -O removes assert statements so
> > the code won't fail with an AssertionError which would be expected.
> >
> > So what real exception should Thread.start() raise? I have suggested
> > adding an IllegalStateError modelled after java's
> > IllegalStateException, but that idea was rejected. So what exception
> > should be raised here, is it a RuntimeError?
>
> If you want to be fully backwards compatible, you could just write this like::
>
>     def start(self):
>         if not self.__initialized:
>             raise AssertionError("Thread.__init__() not called")
>         if self.__started:
>             raise AssertionError("thread already started")
>
> But I doubt anyone is actually catching the AssertionError, so
> changing the error type would probably be okay.

Anything that causes an "assert" to fail is technically using
"undefined" behavior. I am in favor of changing this case to
RuntimeError, which is the error Python usually uses for state
problems.

-- 
--Guido van Rossum (home page: http://www.python.org/~guido/)


More information about the Python-Dev mailing list