python捕获线程异常
① python中主线程怎样捕获子线程的异常
最近因为别的需求,写了一个模块,似乎在这里能用得上:
https://github.com/SakuraSa/ChatProcess
其中的 example.py :
#!/usr/bin/envpython
#coding=utf-8
"""
example
"""
__author__='Rnd495'
fromtimeimportsleep
fromChatProcessimportChatroom
classEcho(Chatroom):
"""
Echo
"""
defresponse(self,data):
ifdata.startswith('sleep'):
sec=float(data[6:])
sleep(sec)
return'wakeupafter%dms'%(sec*1000)
elifdata:
returndata
else:
self.stop()
return'goodbye'
if__name__=='__main__':
,ProcessError
print'process01:'
e=Echo.create_process(lifetime=1).start()
printe.chat('Helloworld!'),e.remain
printe.chat('sleep:0.1'),e.remain
printe.chat(''),e.remain
print''
print'process02:'
e=Echo.create_process(lifetime=1).start()
try:
printe.chat('Helloworld!'),e.remain
printe.chat('sleep:1.0'),e.remain
printe.chat(''),e.remain
exceptTimeoutError,error:
print'error:',error
print''
print'process03:'
e=Echo.create_process(lifetime=1).start()
try:
printe.chat('Helloworld!'),e.remain
printe.chat('sleep:notanum'),e.remain
printe.chat(''),e.remain
exceptProcessError,error:
print'error:',error
运行结果为:
process01:
Helloworld!0.773000001907
wakeupafter100ms0.549000024796
goodbye0.547000169754
process02:
Helloworld!0.868000030518
error:TimeoutError
process03:
Helloworld!0.868000030518
error:('Erroroccurredonloop',ValueError('couldnotconvertstringtofloat:notanum',))
在其中的 process01 中,主进程捕获了 超时
在其中的 process02 中,主进程捕获了 子进程的错误
不知道你能不能用得上
② python程序,谁能给我解释解释,捕捉到异常后,到底怎么处理的,为啥会是这个结果
当flatten被调用时,有两种可能性(处理递归时大部分时都是有两种情况):基本情况和需要递归的情况。在基本的情况中,函数被告知展开一个元素(比如一个数字),这种情况下,for循环会引发一个TypeError异常(因为试图对一个数字进行迭代),生成器会产生一个元素。
TypeError: 'int' object is not iterable
如果展开的是一个列表(或者其他的可迭代对象),那么就要进行特殊处理。程序必须遍历所有的子列表(一些可能不是列表),并对它们调用flatten。然后使用另一个for循环来产生被展开的子列表的所有元素。这可能看起来有点不可思议,但却能工作。
③ Python为什么捕获不到异常,程序总是自动终止
timeout 是run time error,你试试用Error,是可以捕获的。
④ python如何捕获错误信息
首先我们声明一个字符串,然后构建下表获取字符串中的字符,
然后我们经常会用一个越界的下表进行访问,就会报如下的错误:
相关推荐:《Python教程》
如果我们想捕获这个错误,并且加入我们自己的提示信息的话,可以用try与catch进行,
另外except中也可以精确的指定某一个异常类型,如下图所示,指定了除数为0的异常。
如果想输出异常提示信息的话,直接在except里进行输出即可,
最后提醒一下的是,try与except语句中也可以运用else语句的,
综上所述,python中进行异常的捕获运用try与except语句即可,异常信息的显示也可以自己进行定制。
⑤ 怎样在python中捕获线程抛出的异常
python的线程中的异常,通常不会给你显示出错的语句。你可以将thread函数,或者是Thread的run里的内容用整个儿的try catch包裹起来。搜索 然后这样 import traceback,sys try: threadfun1() except: traceback.print_exc(file=sys.stdout) 这样...
⑥ python实现了多线程,如果使用了命令kill把正在运行的进程kill掉的话,可能某些线程会出错,怎么解决
主线程捕获kill的信号以后去终止其他线程, 等其他线程完成以后, 再在主线程中退出.不过更现代的实现并发的方法是使用异步, 而不是多线程.python实现了多线程,如果使用了命令kill把正在运行的进程kill掉的话,可能某些线程会出错,怎么解决?
⑦ Python异常处理知识点汇总,五分钟就能学会
什么是异常?
1.错误
从软件方面来说,错误是语法或是逻辑上的。错误是语法或是逻辑上的。
语法错误指示软件的结构上有错误,导致不能被解释器解释或编译器无法编译。这些些错误必须在程序执行前纠正。
当程序的语法正确后,剩下的就是逻辑错误了。逻辑错误可能是由于不完整或是不合法的输入所致;
在其它情况下,还可能是逻辑无法生成、计算、或是输出结果需要的过程无法执行。这些错误通常分别被称为域错误和范围错误。
当python检测到一个错误时,python解释器就会指出当前流已经无法继续执行下去。这时候就出现了异常。
2.异常
对异常的最好描述是:它是因为程序出现了错误而在正常控制流以外采取的行为。
这个行为又分为两个阶段:首先是引起异常发生的错误,然后是检测(和采取可能的措施)阶段。
第一阶段是在发生了一个异常条件(有时候也叫做例外的条件)后发生的。
只要检测到错误并且意识到异常条件,解释器就会发生一个异常。引发也可以叫做触发,抛出或者生成。解释器通过它通知当前控制流有错误发生。
python也允许程序员自己引发异常。无论是python解释器还是程序员引发的,异常就是错误发生的信号。
当前流将被打断,用来处理这个错误并采取相应的操作。这就是第二阶段。
对于异常的处理发生在第二阶段,异常引发后,可以调用很多不同的操作。
可以是忽略错误(记录错误但不采取任何措施,采取补救措施后终止程序。)或是减轻问题的影响后设法继续执行程序。
所有的这些操作都代表一种继续,或是控制的分支。关键是程序员在错误发生时可以指示程序如何执行。
python用异常对象(exception object)来表示异常。遇到错误后,会引发异常。
如果异常对象并未被处理或捕捉,程序就会用所谓的回溯(traceback)终止执行
异常处理
捕捉异常可以使用try/except语句。
try/except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理。
如果你不想在异常发生时结束你的程序,只需在try里捕获它。
语法:
以下为简单的try....except...else的语法:
Try的工作原理是,当开始一个try语句后,python就在当前程序的上下文中作标记,这样当异常出现时就可以回到这里,try子句先执行,接下来会发生什么依赖于执行时是否出现异常。
如果当try后的语句执行时发生异常,python就跳回到try并执行第一个匹配该异常的except子句,异常处理完毕,控制流就通过整个try语句(除非在处理异常时又引发新的异常)。
如果在try后的语句里发生了异常,却没有匹配的except子句,异常将被递交到上层的try,或者到程序的最上层(这样将结束程序,并打印缺省的出错信息)。
如果在try子句执行时没有发生异常,python将执行else语句后的语句(如果有else的话),然后控制流通过整个try语句。
使用except而不带任何异常类型
可以不带任何异常类型使用except,如下实例:
以上方式try-except语句捕获所有发生的异常。但这不是一个很好的方式,我们不能通过该程序识别出具体的异常信息。因为它捕获所有的异常。
⑧ 如何让Python线程支持excepthook
在游戏中,一般会在主线程开始时,设置一个 excepthook,来对程序异常进行特定处理。
每个线程都有自己的栈,只要在发生异常时,能够把自己的调用栈和异常的相关信息,发给特定的异常处理函数(比如用户自定义的函数)处理,就可以实现 excepthook。理论上任何语言实现的线程,都可以实现 excepthook,只是对线程的异常捕获和 excepthook 的实现有要求。在 excepthook 实现中,如果有对资源(比如日志文件)和全局变量的访问,需要做好线程互斥处理。在工作线程中,当发生异常并逐级向上抛时,如果在最上层(工作线程的 main 函数)还没有被捕获,则线程会被异常终止;此时,设置的 excepthook 可能就无法发生作用了。
对 Python 线程而言,需要明确几点:
1,自定义的 excepthook 是赋值给 sys.excepthook 的。
2,程序启动时,bulit-in 的 sys.excepthook 会被保存在 sys.__excepthook__ 中。
3,当工作线程发生异常并被捕获时,如果有用户自定义的 excepthook,就应该交由该函数处理。
再来看 Python 库中 threading.py 的实现,在 Thread.__bootstrap_inner() 函数中,调用 run() 后捕捉的异常,没有对用户自定义的 excepthook 进行判断,也就导致了 Python 线程的 excepthook 无法生效。如果把代码改为如下(...... 表示保持原来的代码不变):
[python] view plain
try:
self.run()
except SystemExit:
......
except:
......
if _sys:
if id(_sys.excepthook) != id(_sys.__excepthook__):
exc_type, exc_value, exc_tb = self.__exc_info()
_sys.excepthook(exc_type, exc_value, exc_tb)
else:
_sys.stderr.write("Exception in thread %s:\n%s\n" %
(self.getName(), _format_exc()))
else:
......
则在线程中发生异常时,预设的 excepthook 就可以正常生效了。