阅读您编辑的问题后,我不确定您遇到了两个问题中的哪一个。
如果您的问题只是您只想要一个异常来终止一个循环迭代而不是整个循环,那么只需以明显的方式重新嵌套语句即可。而不是这个:
try:
for table in tables:
my_method(table) #Exception message gets passed in with BadTableName, but the program ends. Subsequest iterations of this loop never happen
except Exception, e:
print e
做这个:
for table in tables:
try:
my_method(table) #Exception message gets passed in with BadTableName, but the program ends. Subsequest iterations of this loop never happen
except Exception, e:
print e
另一方面,如果问题是客户端没有捕获异常,那么问题很可能是您MyException
的不是Exception
. 至少有三种方式会发生这种情况。
由于您使用的是旧式except
语法 ( except Exception, e:
) 而不是新式 ( except Exception as e:
),因此您可能使用的是较旧的 Python 版本,它允许您引发不继承自BaseException
. 例如:
class MyException(object):
def __init__(self, msg):
pass
try:
raise MyException("dsfsdf")
except Exception:
pass
根据您的 Python 版本,这可能无法引发MyException
,而是引发 a TypeError('
Out[11]: TypeError('exceptions must be old-style classes or derived from BaseException, not MyException')
(这将被捕获),或打印警告,或者只是按照您的要求默默地“工作”(这意味着您没有捕获任何东西,而您的程序退出并回溯)。
同时,即使在 2.7 中,您仍然可以提出旧式类,也不会被捕获:
class MyException:
def __init__(self, msg):
pass
try:
raise MyException("dsfsdf")
except Exception:
pass
这将始终无法捕获异常,并且您的应用程序将退出并带有回溯。
最后,如果你继承自BaseException
而不是Exception
,那么显然Exception
不会抓住它。
class MyException(BaseException):
def __init__(self, msg):
pass
try:
raise MyException("dsfsdf")
except Exception:
pass
再一次,这将始终无法捕获您提出的内容,并且您将退出并进行回溯。