2016-10-21 33 views
6

私はしばらくの間、Pythonを学んでいます。raise関数とassertは(実際に似ていますが、私が気づいたのはtry - exceptとは違って、両方がアプリをクラッシュさせるということです)試しにRaiseまたはAssertを使用する状況を参照してください。Raise TryとAssertの違い

+1

raise、assert、またはtryを使用するかどうかを選択できますが、実際には交換できません。また、あなたは質問しませんでした。 – tcooc

+1

ありがとうtcoc!私は確かに質問をしました、もしあなたがこれらの機能のうちの1つだけを使うことができる状況を誰かが私に示すことができればそれがあります。 – Defneit

+1

@Defneit Pythonのドキュメントにそのような例があります。また、あなたの質問ではなく、コメントで質問する必要があります。 – Goyo

答えて

7

アサート:

list_ = ["a","b","x"] 
assert "x" in list_, "x is not in the list" 
print("passed") 
#>> prints passed 

list_ = ["a","b","c"] 
assert "x" in list_, "x is not in the list" 
print("passed") 
#>> 
Traceback (most recent call last): 
    File "python", line 2, in <module> 
AssertionError: x is not in the list 

レイズ:

つあなたが特定の条件に基づいてスクリプトを "停止" と高速デバッグを助けるために何かを返したい場合に使用し

これに便利な理由:

1/tryとexceptブロックで使用します。あなたが選択したエラーを発生させ、以下のようなカスタムになる可能性があります。passまたはcontiuneスクリプトの場合はスクリプトを停止しません。または事前に定義されたエラーraise ValueError()

class Custom_error(BaseException): 
    pass 

try: 
    print("hello") 
    raise Custom_error 
    print("world") 
except Custom_error: 
    print("found it not stopping now") 

print("im outside") 

>> hello 
>> found it not stopping now 
>> im outside 

することができ、それが停止していない気づきましたか? exceptブロックでexit(1)だけを使用して停止することができます。

2/Raiseは、現在のエラーをスタックに渡して、別のものがそれを処理できるかどうかを確認するために使用することもできます。

except SomeError, e: 
    if not can_handle(e): 
      raise 
    someone_take_care_of_it(e) 

try/exceptブロック:

は、あなたが考えて正確に何んのエラーが起動した場合、あなたはそれをキャッチし、あなたが好きどのように今までそれに対処する、何かをしようとします。上の例があるので、例はありません。

4
assert cond, "text" 

if cond == False: 
    raise AssertionError("text") 

使用のようなものに拡張され、それは、より読みやすいので、主張して​​います。

+0

ありがとう!今より意味をなさない! – Defneit

+0

短くてクリスピーな、ありがとう:) –

5

raise - 例外を発生させます。

assert - の場合は、条件が真(またはそうでない場合)です。

try - かもしれないいくつかのコードを実行し、例外が発生した場合はそれをキャッチします。

1

例外は、コード実行時に発生するエラーを処理するためにPython(および他の言語)が使用するものです。 raise ExceptionNameは、コードにエラーがあり、その問題に関連する例外を発生させることによってどのような種類の問題であるかを指定しています。 assert expressionexpressionと評価され、falseの場合は例外が発生します。

tryは、期待している例外が発生する可能性のあるコードを実行するために使用されます。プログラムを停止する代わりに、例外を「キャッチ」してコード内で処理することができます。

例:辞書とリストがあるとします。あなたは辞書にない1に達するまで、辞書内のリストから物事を見てみたい:

try: 
    for item in my_list: 
     print(my_dictionary[item]) 
except KeyError as e: #KeyError is the Exception raised when a key is not in a dictionary 
    print('There is no {} in the dictionary'.format(e.args[0])) 
+0

ありがとう!今私はあなたのおかげでコーディングを続けることができます! – Defneit

3

try/exceptブロックでは、例外をキャッチして管理できます。例外は、raise,assertによってトリガーされ、空のリストのインデックスを作成しようとするなどの多数のエラーが発生する可能性があります。 raiseは、通常、エラー状態を検出したときに使用されます。 assertは似ていますが、条件が満たされた場合にのみ例外が発生します。

raiseおよびassertは、異なる考え方を持っています。エラーを検出して発生させるコードには、多くの「通常の」エラーがあります。おそらくウェブサイトが存在しないか、パラメータ値が範囲外です。

アサーションは、一般に「これは起こり得ない」と断言されています。通常のランタイムエラー検出よりもランタイムデバッグに似ています。アサーションを無効にするには、.pycファイルの代わりに-Oフラグを使用するか、.pyoファイルを実行すると、アサーションを無効にすることができます。

生産品質コードで例外が発生した場合は、間違ったことを把握してください。 AssertionErrorが発生すると、大きな問題が発生します。

+0

ありがとう、たくさんの男。多くの助けてくれました – Defneit

1

アサートは、一般的に何かが働いていることを確認するためのテストコードで使用されます。

def test_bool(): 
    assert True != False 

どことして上げるとハンドルとの誤差を伝播するPythonで好ましい方法である化粧例外処理を除いて、試してみてください。

ほとんどのライブラリとPythonの組み込み関数は、何か問題が生じた場合に、1つの型または別の型の例外と例外を発生させます。あなた自身のコードでは、間違ったことが検出されたときに例外を発生させたいことがあります。たとえば、メールアドレスのバリデータを作成していて、アドレスに@記号が含まれていない場合は例外を発生させたいとしましょう。そして、どこかあなたのコード内で使用すると、validate_email関数を呼び出すことができますし、それが失敗した場合、例外がスローされます

def validate_email(address): 
    if not "@" in address: 
     raise ValueError("Email Addresses must contain @ sign") 

:あなたは(これはおもちゃのコードで、実際にこのようなメールを検証しません)のようなものを持つことができます。

try: 
    validate_email("Mynameisjoe.com") 
except ValueError as ex: 
    print("We can do some special invalid input handling here, Like ask the user to retry the input") 
finally: 
    close_my_connection() 
    print("Finally always runs whether we succeed or not. Good for clean up like shutting things down.") 

重要なことは、例外が発生すると、ハンドラが見つかるまでコールスタックに渡されることです。ハンドラが見つからない場合は、例外とスタックトレースを持つプログラムがクラッシュします。今、あなたはあなたのアプリケーションが吹いた理由を知る方法はありません

if __name__ == '__main__': 
    try: 
     print(1/0) 
    except Exception as ex: 
     pass 

:あなたが行うにはしたくない

ことの一つは、のようなものです。それはパラメータと同じエラーが再度発生させていないので、この場合の

import logging 
if __name__ == '__main__': 
    try: 
     print(1/0) 
    except Exception as ex: 
     logging.exception(ex) 
     raise 

昇給:あなたがOKであることが多いでしょう

ことの一つは、のようなものです。しばしばウェブコードでは、クライアントに500のエラーを送信して次のリクエストを実行するので、例外を再発生しないようなものが表示されます。この場合、プログラムを終了させたくありません。

+0

ありがとう – Defneit