2

1回以上の反復で例外が発生する可能性のあるループがあります。ループを完了させてから、最初に発生した例外を発生させます。次の例では「raiseon4」です。

コード例:

e = None
for x in range(10):
    try:
        print x
        if x == 4:
            raise Exception('raise on 4')
        if x == 6:
            raise Exception('raise on 6')
    except Exception as e:
        print e
        continue
else:
    if e:
        raise

出力:

0
1
2
3
4
raise on 4
5
6
raise on 6
7
8
9
Traceback (most recent call last):
  File "<stdin>", line 7, in <module>
Exception: raise on 6

ロギングモジュールを使用してそれらを記録することはできますが、可能であれば最初の例外を発生させたいと思います。

私はまだPythonにかなり慣れていないので、「else」ステートメントを使用してループを構築した方法が非常にPythonicであるか、正しいかどうかは完全にはわかりません。

4

2 に答える 2

3

e別の変数に格納する必要があります。

firste = None
for x in range(10):
    try:
        print x
        if x == 4:
            raise Exception('raise on 4')
        if x == 6:
            raise Exception('raise on 6')
    except Exception as e:
        if firste is None:
            firste = e
        continue

if firste is not None:
    raise firste

Nowfirsteは、例外が最初に発生したときにのみ設定されます。

この場合、使用する必要はありませんelsebreakforループにスイートをスキップするステートメントが含まれている場合にのみ使用してください。それ以外の場合は、冗長なスイートインデントを使用せずにループの下にelseテストを配置してください。firsteforelse

于 2012-12-05T11:29:06.100 に答える
1

エラーをリストに追加し、後で発生させることができます。

In [25]: errors=[]

In [26]: for x in range(10):
        try:
                print x
                if x == 4:
                        raise Exception('raise on 4')
                if x == 6:
                        raise Exception('raise on 6')
        except Exception as e:
                    errors.append(e)
                    continue
   ....:             
0
1
2
3
4
5
6
7
8
9

In [27]: for error in errors:
    raise error
   ....: 
---------------------------------------------------------------------------
Exception                                 Traceback (most recent call last)
<ipython-input-27-1f1d8ab5ba84> in <module>()
      1 for error in errors:
----> 2     raise error

Exception: raise on 4
于 2012-12-05T11:34:49.827 に答える