Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.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
Tcl的Python等价物;捕获;带有用于错误输出的变量_Python - Fatal编程技术网

Tcl的Python等价物;捕获;带有用于错误输出的变量

Tcl的Python等价物;捕获;带有用于错误输出的变量,python,Python,在Tcl中,您可以使用catch命令向变量发送错误输出,如下所示: % catch {eval exec bogomips &} outage 1 % puts $outage couldn't execute "bogomips": no such file or directory 在Python中(我还是初学者),我知道try基本上等同于catch,但我不知道如何在变量中捕获错误输出。这可以在Python中完成,而不必求助于子流程、Popen等吗?如果是,如何使用?您可以使用一个

在Tcl中,您可以使用
catch
命令向变量发送错误输出,如下所示:

% catch {eval exec bogomips &} outage
1
% puts $outage
couldn't execute "bogomips": no such file or directory

在Python中(我还是初学者),我知道
try
基本上等同于
catch
,但我不知道如何在变量中捕获错误输出。这可以在Python中完成,而不必求助于子流程、Popen等吗?如果是,如何使用?

您可以使用一个或多个
except
子句来捕获适当的异常类型:

def something(x):
    if type(x) != int:
        raise TypeError("Expected an int, but was %s" % str(type(x)))
    if x == 0:
        raise ValueError("Zero not allowed")

try:
    something(0)
except ValueError as e:
    print 'got a value error:', e
except TypeError as e:
     print 'got a type error:', e
(Python 2代码,但Python 3在这方面是相同的。)


以下是关于错误和异常的文档:

捕获外部程序错误:

import subprocess
print(subprocess.Popen("dir c:\\dosent\\exists", shell=True, stderr=subprocess.PIPE).stderr.read().decode('cp866'))

try:do my stuff
除了MyException as e:
pass
现在
e
将是例外。请检查为我提供错误消息的,但它没有被捕获到名为e的变量中。很抱歉。我误解了。您确实需要使用
子流程
来执行您想要的操作。如果你想这么做,我可以告诉你怎么做。谢谢,我知道怎么做,但这不像在Tcl中使用
catch
那么简单。幸运的是,如果需要,可以从Python中调用
catch
:在导入tkinter和messagebox之后,打开一个根窗口并运行以下行:
root.tk.eval('catch{eval exec bogomips&}中断;tk_messagebox-message$output')
!如果isinstance(x,int):而不是type(x)=int:,则应该使用
,这样,
int
的子类仍然符合条件。另外,如果x==0,则使用
if not x:
而不是
if x==0:
它更短;这只是一个建议。不过,我对isinstance()有相当强烈的看法。诚实的好奇:为什么?人们真的把int子类化了吗?事实上,甚至还有一个内置的子类
int
bool
。它按预期给了我一条指定的错误消息,但这不是我想要的。我想捕获标准错误输出,例如,
无法执行“bogomips”:没有这样的文件或目录
。我查看了文档,没有看到(至少没有看到明显的)关于如何在变量中捕获标准错误输出的内容。我成功地使用了subprocess和Popen,但如果Python不能提供一种更简单的方法来处理Tcl中的一行代码,我会感到失望。我发现他说的是来自一个单独程序的错误消息。我建议您在有人大肆反对投票之前删除此答案。这也不会捕获变量中的错误输出,正如我将
print(err)
更改为
print('Bogosity:'+err)
时所发现的那样。我仍然只收到错误信息,没有“虚假”。@McClamrock也许这就是你想要的?