Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
linux/python中的异常过滤_Python_Linux_Exception - Fatal编程技术网

linux/python中的异常过滤

linux/python中的异常过滤,python,linux,exception,Python,Linux,Exception,假设我有以下执行流程: def method1: try: method2() except Exception as e: handle_exception() def method2: command = "<some linux command>" status = execute_command(command)

假设我有以下执行流程:

       def method1:
          try:
            method2()
          except Exception as e:
            handle_exception()

        def method2:
          command = "<some linux command>"
          status = execute_command(command) 
          if status != 0:   
            log_exception()

        def execute_command(command):
            subprocess.popen(command, <other params>)

        method1()  

将调用
handle\u exception()
?我的理解是将打印回溯,因为异常不会渗透到
method1
。这是因为
execute\u命令(..)
将产生一个不同的进程,它将有自己的调用堆栈。我的理解正确吗?

不,不会,也不会打印回溯。实际上,用户看不见的情况不会发生(前提是您修复了明显的语法错误)。

简短的回答是:如果您获得的状态代码不是0,则希望运行除之外的
块,则在
方法2
中引发错误:

  if (status != 0)   
    log_exception()
    raise RuntimeError("got non-0 exit code: %d"%status)
举例说明:这在很大程度上取决于您执行命令的方式,
os.system
仅在您不给它一个
str
时才会引发错误:

import os
... #def method1 and method2
execute_command = os.system
method1()
这将调用
log\u exception()
,因为
不是有效的命令。但是没有引发错误,因此不会使用
handle\u exception()
。您还可以使用
子流程。调用

import subprocess
... #def method1 and method2
execute_command = subprocess.call
method1()
这样,
subprocess.call
在找不到名为
的可执行文件,但进程有效且失败时,会引发错误:

import subprocess

... #def method1

def method2():
  command = ["python","-c","INVALID CODE !!"]
  status = subprocess.call(command)
  if(status !=0):
      print("got non-0 status:  %r"%status)

method1()
这样,调用中出现错误并返回非0状态,但这不会在python中引发任何错误,如果希望
method2
为非0退出状态引发python错误,这很容易做到:

  if (status != 0)   
    log_exception()
    raise RuntimeError("got non-0 exit code: %d"%status)

从您显示的代码来看,是的,
handle\u exception
将被调用,因为
method2
引发了一个异常,或者更明确地说,
execute\u command
引发了一个不由
method2
处理的异常,因此它将在调用堆栈中上升。为什么不尝试运行它并添加一些
print()
语句来查看它的功能?我发现这是一个很好的学习方法:-)当你编辑你的帖子时,你只是放弃了我已经做过的所有格式,这不是一个很好的方法。这不是一个建议,而是对以前版本问题的实际回答。我很确定这至少对当时制定的问题是准确的。但我想这并不合适。你没有提供上下文或解释;在什么情况下,用户看不见的情况会发生?在问题的原始版本中,没有调用
method1
,这将导致没有输出,但很明显,这不是复制粘贴可运行的代码。如果
log\u exception
handle\u exception
没有显示信息,它也不会给出任何输出,但这意味着它们会显示信息。那么,在什么情况下,用户看不见的事情会发生?从:
中,任何让提问者朝着正确方向前进的答案都是有帮助的,但一定要在答案中提及任何限制、假设或简化。简明扼要是可以接受的,但更全面的解释更好。
我想如果简明扼要是可以接受的,那么你的答案对网站来说是不错的,但是请详细说明你的答案,因为我诚实地认为,当我第一次读到它时,你在讽刺我没有打电话给
method1
。谢谢。我对上一个示例感兴趣,其中第二个进程中的代码引发了异常。因此,我相信我的理解是正确的,首先使用may work代替python命令,因为它位于同一个回溯堆栈中,但与打开子流程完全不同。
  if (status != 0)   
    log_exception()
    raise RuntimeError("got non-0 exit code: %d"%status)