文档说调用sys.exit()会引发一个SystemExit异常,该异常可以在外层捕获.我有一种情况,我想明确地,毫无疑问地退出测试用例,但是unittest模块捕获SystemExit并阻止退出.这通常很好,但我试图处理的具体情况是我们的测试框架检测到它被配置为指向非测试数据库的情况.在这种情况下,我想退出并阻止运行任何进一步的测试.当然,由于unittest陷入了SystemExit的困境并继续开心,它正在挫败我.
到目前为止我唯一想到的选择是使用ctypes或者类似的东西来直接调用exit(3),但这对于一些非常简单的东西来说似乎是一个相当糟糕的黑客.
我知道这个问题很常见,并且在Stack Overflow上多次询问,但在访问了近四页的搜索引擎结果和几乎关于这个问题的Stack Overflow的20个问题后,我发现它们都没有得到正确的解决或回答.
我想要的是:
我想在最近的应用程序列表中显示我的应用程序,但是当我关闭应用程序时,我的进程应该被终止,应用程序应该从最近的应用程序列表中删除.
我找到了一些答案:
use System.exit(0); //doesn't clear app from recents
OR
use android.os.Process.killProcess(android.os.Process.myPid()); //doesn't clear app from recents
OR
use finish() or this.finish() or Activity.finish();// doesn't clear app from recents
Run Code Online (Sandbox Code Playgroud)
我在每个答案中看到的一个常见建议是在清单中添加以下代码:
android:excludeFromRecents //I think this is wrong approach.
Run Code Online (Sandbox Code Playgroud)
因为当用户在我的应用程序运行时按下主页按钮添加此项后,用户无法在最近的应用程序列表中看到我的应用程序.
关于此的许多其他建议,但他们都没有做任何关闭应用程序和从最近的应用程序列表中清除应用程序.此外,如果你进去Settings>Apps>yourApp>your Application看到仍然它要求"强制停止"意味着应用程序正在运行!
有一些类似的问题,但没有提供我需要的答案.
如果我通过创建线程threading.Thread然后抛出未处理的异常,则终止这些线程.我希望使用堆栈跟踪保留缺省打印的异常详细信息,但也要关闭整个过程.
我认为有可能捕获线程中的所有异常,并在主线程对象上重新加载它们,或者可能手动执行默认的异常处理,然后SystemExit在主线程上引发一个.
最好的方法是什么?
我对system.exit有点困惑.我从这个链接创建了一些东西.
但我心里有些疑惑.如果我使用系统退出,创建的对象,变量和ect会发生什么.一旦我调用system.exit,一切都会被破坏吗?如果"是"那么为什么我们强制在system.exit()之前进行垃圾收集?如果"否"创建的对象存储在JVM(内存)中多长时间?如果在退出系统后再次运行程序,如果在我调用System.exit()之后它们没有被销毁,前一个对象会发生什么?
谢谢.
在 pytest 中断言 UserWarning 和 SystemExit
在我的应用程序中,我有一个函数,当提供错误的参数值时,它将UserWarnings从warnings模块引发,然后SystemExit从sys模块引发。
代码是这样的:
def compare_tags(.....):
requested_tags = user_requested_tags # as list
all_tags = tags_calculated_from_input_file # as list
non_matching_key = [x for x in requested_tags if x not in all_tags]
# if user requested non existing tag then raise warning and then exit
if len(non_matching_key) > 0:
# generate warning
warnings.warn("The requested '%s' keys from '%s' is not present in the input file. Please makes sure the input …Run Code Online (Sandbox Code Playgroud) 我需要从最近使用的应用列表中删除应用.API级别21及以上版本没有问题.我使用finishAndRemoveTask()方法.但是这个方法不能用于比21更爱的API级别.如何在比21级更爱的API级别上调用该方法?
我尝试了解决方案,但它们不起作用:
我正试图通过task_postrun信号中的raisin SystemExit()关闭主芹菜过程.信号被触发就好了,异常会被提升,但是工作者永远不会完全退出并挂起.
我该如何工作?
我忘记了某个地方的设置吗?
下面是我正在为worker(worker.py)使用的代码:
from celery import Celery
from celery import signals
app = Celery('tasks',
set_as_current = True,
broker='amqp://guest@localhost//',
backend="mongodb://localhost//",
)
app.config_from_object({
"CELERYD_MAX_TASKS_PER_CHILD": 1,
"CELERYD_POOL": "solo",
"CELERY_SEND_EVENTS": True,
"CELERYD_CONCURRENCY": 1,
"CELERYD_PREFETCH_MULTIPLIER": 1,
})
def shutdown_worker(**kwargs):
print("SHUTTING DOWN WORKER (RAISING SystemExit)")
raise SystemExit()
import tasks
signals.task_postrun.connect(shutdown_worker)
print("STARTING WORKER")
app.worker_main()
print("WORKER EXITED!")
Run Code Online (Sandbox Code Playgroud)
以下是tasks.py的代码:
from celery import Celery,task
from celery.signals import task_postrun
import time
from celery.task import Task
class Blah(Task):
track_started = True
acks_late = False
def run(config, kwargs):
time.sleep(5)
return "SUCCESS …Run Code Online (Sandbox Code Playgroud) 我正在测试一个包含以下代码片段的 Python 模块。
r, w = os.pipe()
pid = os.fork()
if pid:
os.close(w) # use os.close() to close a file descriptor
r = os.fdopen(r) # turn r into a file object
# read serialized object from ``r`` and persists onto storage medium
self.ofs.put_stream(bucket, label, r, metadata)
os.waitpid(pid, 0) # make sure the child process gets cleaned up
else:
os.close(r)
w = os.fdopen(w, 'w')
# serialize object onto ``w``
pickle.dump(obj, w)
w.close()
sys.exit(0)
return result
Run Code Online (Sandbox Code Playgroud)
所有测试都通过了,但是有困难sys.exit(0)。执行时sys.exit(0),它会引发 …
按下Ctrl + C时,我的while循环不会退出.它似乎忽略了我的KeyboardInterrupt异常.循环部分如下所示:
while True:
try:
if subprocess_cnt <= max_subprocess:
try:
notifier.process_events()
if notifier.check_events():
notifier.read_events()
except KeyboardInterrupt:
notifier.stop()
break
else:
pass
except (KeyboardInterrupt, SystemExit):
print '\nkeyboardinterrupt found!'
print '\n...Program Stopped Manually!'
raise
Run Code Online (Sandbox Code Playgroud)
同样,我不确定问题是什么,但我的终端甚至从未打印过我的异常中的两个打印警报.有人能帮我解决这个问题吗?
python systemexit infinite-loop keyboardinterrupt try-except
这个try/ except陈述有两个目标.
return如果没有问题,它需要值为1,如果出现任何问题,则需要为0.我return有价值的工作.我也有SystemExit()工作.但是在一起,他们没有工作.
我的Python脚本(相关):
except IOError:
value_to_return = 0
return value_to_return
raise SystemExit("FOOBAR")
Run Code Online (Sandbox Code Playgroud)
有了它,它raise SystemExit("FOOBAR")完全忽略了这条线.我如何才能获得退货价值raise SystemExit("FOOBAR")呢?对某些人来说这可能是基本的,但实际上我遇到了很多困难.
systemexit ×10
python ×7
android ×2
exception ×2
pytest ×2
celery ×1
exit ×1
java ×1
jvm ×1
object ×1
return ×1
signals ×1
try-except ×1
unit-testing ×1
user-warning ×1