相关疑难解决方法(0)

在Python的调用者线程中捕获线程的异常

我对Python和多线程编程很新.基本上,我有一个脚本,将文件复制到另一个位置.我希望将它放在另一个线程中,以便我可以输出....以指示脚本仍在运行.

我遇到的问题是,如果文件无法复制,它将引发异常.如果在主线程中运行,这是可以的; 但是,具有以下代码不起作用:

try:
    threadClass = TheThread(param1, param2, etc.)
    threadClass.start()   ##### **Exception takes place here**
except:
    print "Caught an exception"
Run Code Online (Sandbox Code Playgroud)

在线程类本身,我试图重新抛出异常,但它不起作用.我看到这里的人问类似的问题,但他们似乎都在做一些比我想做的更具体的事情(而且我不太了解提供的解决方案).我见过人们提到使用它sys.exc_info(),但我不知道在哪里或如何使用它.

非常感谢所有帮助!

编辑:线程类的代码如下:

class TheThread(threading.Thread):
    def __init__(self, sourceFolder, destFolder):
        threading.Thread.__init__(self)
        self.sourceFolder = sourceFolder
        self.destFolder = destFolder

    def run(self):
        try:
           shul.copytree(self.sourceFolder, self.destFolder)
        except:
           raise
Run Code Online (Sandbox Code Playgroud)

python multithreading exception-handling exception

178
推荐指数
10
解决办法
15万
查看次数

Python全局异常处理

所以我想抓住KeyboardInterrupt全球,并妥善处理它.我不想把我的整个脚本包含在一个巨大的try/except语句中,因为这听起来很糟糕.有没有办法做到这一点?

python exception

46
推荐指数
4
解决办法
3万
查看次数

如果任何线程有异常,则导致 python 退出

我有一个 python3 程序,它启动第二个线程(除了主线程)来异步处理一些事件。理想情况下,我的程序可以正常运行,并且永远不会有未处理的异常。但事情发生了。当/如果有异常,我希望整个解释器以错误代码退出,就好像它是单个线程一样。那可能吗?

现在,如果在生成的线程上发生异常,它会打印出通常的错误信息,但不会退出。主线程一直在运行。

例子

import threading
import time

def countdown(initial):
    while True:
        print(initial[0])
        initial = initial[1:]
        time.sleep(1)

if __name__ == '__main__':
    helper = threading.Thread(target=countdown, args=['failsoon'])
    helper.start()
    time.sleep(0.5)
    #countdown('THISWILLTAKELONGERTOFAILBECAUSEITSMOREDATA')
    countdown('FAST')
Run Code Online (Sandbox Code Playgroud)

countdown最终将无法访问[0],因为它已经清空引起从字符串IndexError: string index out of range错误。目标是无论主程序还是辅助程序先死,整个程序都会死,但堆栈跟踪信息仍然输出。

尝试的解决方案

经过一番挖掘,我的想法是使用sys.excepthook. 我添加了以下内容:

def killAll(etype, value, tb):
    print('KILL ALL')
    traceback.print_exception(etype, value, tb)
    os.kill(os.getpid(), signal.SIGKILL)

sys.excepthook = killAll
Run Code Online (Sandbox Code Playgroud)

如果主线程是第一个死亡的线程,则此方法有效。但在另一种情况下则不然。这似乎是一个已知问题(https://bugs.python.org/issue1230540)。我会在那里尝试一些解决方法。

虽然该示例显示了我创建的一个主线程和一个辅助线程,但我对我可能正在运行启动线程的其他人的库的一般情况感兴趣。

multithreading python-3.x

11
推荐指数
2
解决办法
6237
查看次数

使用Python断言记录的"规范"方法

在以下代码中,assert在单元测试之外使用:

import logging

if __name__ == "__main__":
    logging.basicConfig(format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", level=logging.INFO)
    logger = logging.getLogger(__name__)
    logger.info("info level")
    assert 1 == 0
Run Code Online (Sandbox Code Playgroud)

打印如下:

2016-02-16 14:56:58,445 - __main__ - INFO - info level
Traceback (most recent call last):
   File "logtest.py", line 7, in <module>
    assert 1 == 0
AssertionError
Run Code Online (Sandbox Code Playgroud)

什么是"规范"的方式来使用带时间戳的日志记录格式AssertionError由具有隆起assert(可能无需重写每一个assert代码)?

提出了许多类似的问题,主要涉及asserts单元测试环境......谢谢

python logging

6
推荐指数
1
解决办法
2266
查看次数

'sys.excepthook' 和多处理

我正在尝试使用带有多处理库的自定义 sys.excepthook 来处理所有线程上的异常。我知道python有一个突出的错误,它阻止了它与 Threading 库一起正常工作,并且测试表明这也会影响多处理。

导致我找到它的 Python 错误和Stackoverflow 帖子都有针对 Threading 库的解决方法,但没有针对多处理的解决方法。我试图调整解决方法以用于多处理,但仍像往常一样抛出异常。

def install_thread_excepthook():
    import sys
    start_old = multiprocessing.Process.start
    def start(*args, **kwargs):
        try:
            start_old(*args, **kwargs)
        except (KeyboardInterrupt, SystemExit):
            raise
        except:
            sys.excepthook(*sys.exc_info())
    multiprocessing.Process.start = run
Run Code Online (Sandbox Code Playgroud)

如何使 sys.excepthook 与多处理正常工作?

python multithreading sys

5
推荐指数
0
解决办法
328
查看次数

在 PyCharm 下调试时不调用 sys.excepthook

我有自己的自定义 sys.excepthook 来处理错误(通过自定义错误消息),直接运行时它运行良好。由于将 PyCharm 更新到 2019.3 版本,此功能在调试时不起作用。用于在旧版本中工作。相反,PyCharm 只是打印堆栈并终止进程。

这是一个基本的代码。直接运行时有效,但调试时失败。

import sys
def myExceptHook(type, value, tb):
    print("there's been an error")

# reroute every exception through my hook
sys.excepthook = myExceptHook
raise Exception('error')
Run Code Online (Sandbox Code Playgroud)

调试时,我得到以下输出:

Traceback (most recent call last):
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2019.1.2\plugins\python-ce\helpers\pydev\pydevd.py", line 1434, in _exec
    pydev_imports.execfile(file, globals, locals)  # execute the script
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2019.1.2\plugins\python-ce\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile
    exec(compile(contents+"\n", file, 'exec'), glob, loc)
  File "C:/Projects/TubeEye/code/testraise.py", line 8, in <module>
    raise Exception('error')
Exception: error
Run Code Online (Sandbox Code Playgroud)

但是如果直接运行我得到(如预期的那样): …

python debugging pycharm

5
推荐指数
0
解决办法
249
查看次数