6
try:
    content = my_function()
except:
    exit('Could not complete request.')

上記のコードを変更して、の値をチェックして、文字列が含まれているかどうかを確認したいと思いcontentます。または 正規表現を使用することを考えましたが、それを;if 'stuff' in content:に合わせる方法がわかりません。try一致する場合はFalse、例外が発生します。もちろん、ifそのコードの後に​​いつでも追加できますが、そこにそれを詰め込む方法はありますか?

擬似コード:

try:
    content = my_function()
    if 'stuff' in content == False:
        # cause the exception to be raised
except:
    exit('Could not complete request.')
4

4 に答える 4

11

raise例外を発生させるには、キーワードを使用する必要があります。マニュアルの例外についてもう少し読むことをお勧めします。my_function()時々スローすると仮定するとIndexError、次を使用します。

try:
    content = my_function()
    if 'stuff' not in content:
        raise ValueError('stuff is not in content')
except (ValueError, IndexError):
    exit('Could not complete request.')

また、思った以上に釣れるので絶対に使用しないでください。exceptたとえば、MemoryErrorKeyboardInterruptおよびをキャッチしSystemExitます。これにより、プログラムが強制終了されにくくなり ( Ctrl+Cが想定どおりに動作しなくなります)、メモリ不足の状態でエラーが発生しやすくなり、sys.exit()意図したとおりに動作しなくなります。

更新:キャッチするだけでExceptionなく、より具体的なタイプの例外もキャッチする必要があります。SyntaxErrorからも継承しExceptionます。これは、ファイルに含まれる構文エラーが検出され、適切に報告されないことを意味します。

于 2012-11-12T08:50:57.650 に答える
9
try:
    content = my_function()
    if 'stuff' not in content:
        raise ValueError('stuff not in content')

    content2 = my_function2()
    if 'stuff2' not in content2:
        raise ValueError('stuff2 not in content2')

except ValueError, e:
    exit(str(e))

コードにいくつかの例外がある可能性がある場合は、それぞれに特定の値を定義できます。それをキャッチして終了すると、このエラー値が使用されます。

于 2012-11-12T08:47:39.827 に答える
4

これを行うためのより良い方法は、キーがそこにあることをアサートすることです:

assert 'stuff' in content, 'Stuff not in content'

アサーションが真でない場合はAssertionError、指定されたメッセージとともに が発生します。

于 2012-11-12T09:22:26.490 に答える
3

raiseそれがあなたが求めているものである場合、例外を発生させることができます:

if 'stuff' not in content:
    raise ValueError("stuff isn't there")

発生させる例外の種類を決定する必要があることに注意してください。ここで ValueError を発生させました。同様に、処理したいタイプのエラーのみを捕捉するために、bareexceptを使用するべきではありませんが、などを使用する必要があります。except ValueError実際、この場合、それは特に重要です。my_functionおそらく、発生した実際のエラーと、テストしている「コンテンツにないもの」の状態を区別したいと思うでしょう。

于 2012-11-12T08:49:17.383 に答える