python:[try + except]如何确保执行try下的所有命令?

时间:2016-09-25 12:59:44

标签: python

这是一个非常初学者的问题。但我找不到答案...

我想在try下运行所有行。如果 ANY 行无法执行,请运行except

例如,我有一些像这样的代码......

for i in range(0,100):
    try:
        print "a"
        print "b"
        print i, C
        print "d"
    except:
        print i, "fail"

我希望 ALL 执行try下的行。在此示例中,print C是不可执行的,因为C未预先定义。

因此,我想print i, "fail"下运行except,因为NOT ALL下的try行是可执行的。

更清楚一点,上面的代码给出了结果:

a
b
0 0 Fail
a
b
1 1 Fail
a
b
2 2 Fail
...

但我希望得到这样的结果:

0 Fail
1 Fail
2 Fail
...

我该怎么做?谢谢。

更新
更清楚的是,我不是要求结果,我要求一种方法。我认为应该有一些命令来控制try

3 个答案:

答案 0 :(得分:3)

您可以更改代码,使其仅在所有表达式有效时打印:

const platform = platformBrowserDynamic([SharedService]);
platform.bootstrapModule(AppModule).then((moduleRef: NgModuleRef<any>) => {
  const zone = moduleRef.injector.get(NgZone);
  (<any>platform)._bootstrapModuleWithZone(AppModule2, [], zone); // private method is bad!!!
}); 

同一原则的另一个变体是使用一个列表来存储要打印的东西,如果一切都成功的话:

for i in range(0,3):
    try:
        print ("a" + "\n" +
               "b" + "\n" + 
               C   + "\n" +
               "d")
    except:
        print (i, "fail")

答案 1 :(得分:1)

您可以暂时重定向stdout并仅在except:

中打印
import sys
from StringIO import StringIO


for i in range(0,100):
    sys.stdout = StringIO()
    try:
        print "a"
        print "b"
        print i, C
        print "d"
    except Exception as e:
        sys.stdout = sys.__stdout__
        print i, "fail" # or print e
sys.stdout = sys.__stdout__

哪会给你:

0 fail
1 fail
2 fail
3 fail
4 fail
5 fail
6 fail
7 fail
8 fail
9 fail
10 fail
11 fail
12 fail
13 fail
14 fail
15 fail
16 fail
17 fail
18 fail
19 fail
20 fail
21 fail
22 fail
23 fail
24 fail
25 fail
26 fail
27 fail
28 fail
29 fail
30 fail
31 fail
32 fail
33 fail
34 fail
35 fail
36 fail
37 fail
38 fail
39 fail
40 fail
41 fail
42 fail
43 fail
44 fail
45 fail
46 fail
47 fail
48 fail
49 fail
50 fail
51 fail
52 fail
53 fail
54 fail
55 fail
56 fail
57 fail
58 fail
59 fail
60 fail
61 fail
62 fail
63 fail
64 fail
65 fail
66 fail
67 fail
68 fail
69 fail
70 fail
71 fail
72 fail
73 fail
74 fail
75 fail
76 fail
77 fail
78 fail
79 fail
80 fail
81 fail
82 fail
83 fail
84 fail
85 fail
86 fail
87 fail
88 fail
89 fail
90 fail
91 fail
92 fail
93 fail
94 fail
95 fail
96 fail
97 fail
98 fail
99 fail

但毫无疑问,更好的方法可以做任何你想要在你的真实逻辑中做的事情。

如果所有来电都没有成功,那么看到未来就无法实时打印,因此您需要存储输出并查看是否有任何错误。

import sys
from StringIO import StringIO

stdo = StringIO()
errs = False
for i in range(0, 100):
    sys.stdout = stdo
    try:
        print "a"
        print "b"
        print i
        print "d"
    except Exception as e:
        sys.stdout = sys.__stdout__
        errs = True
        print i, "fail"
        sys.stdout = stdo

sys.stdout = sys.__stdout__
if not errs:
    print(stdo.getvalue())

任何错误都会实时显示,但您必须等到最后才能看到所有错误都成功。

答案 2 :(得分:0)

这与@trincot发布的内容非常相似,不确定它是否符合您的要求。

基本上,将所有打印件移到一个单独的功能中,然后在尝试中调用它。

def printer(i=None, C=None):
    print "a"
    print "b"
    print i, C
    print "d"    

for i in range(0,100):
    try:
        printer(i, C)
    except:
        print i, "fail"