Latest web development tutorials

python3エラーと例外

Pythonの初心者としては、多くの場合、いくつかのエラーメッセージが表示さだけでPythonプログラミングを学ぶ、私たちは専念されます。この章の前には言及しませんでした。

構文エラーと例外:Pythonは2容易に認識エラーがあります。

構文エラー

Pythonの構文エラーまたは誤ったコール・アナリティックは、初心者は、多くの場合の例として、遭遇します

>>> while True print('Hello world')
  File "<stdin>", line 1, in ?
    while True print('Hello world')
                   ^
SyntaxError: invalid syntax

それはコロン(:)が欠落している前に、この例では、関数printは()エラーをチェックされています。

パーサーは彼の党の誤りを指摘し、間違った場所に最初のマーカー小さな矢印を見つけるために。

異常な

でも文法Pythonプログラムが正しいか、それを実行する時が来た、エラーが発生することがあります。 検出されたランタイムエラーは例外と呼ばれています。

ほとんどがここでエラーメッセージ表示の形式で例外ハンドラではありません。

>>> 10 * (1/0)
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
TypeError: Can't convert 'int' object to str implicitly

タイプZeroDivisionError、NameErrorとTypeError例外の例:異なる種類の異常表示され、これらのタイプは、情報の一部として出力されます。

エラーメッセージの前部には、例外の状況は、コールスタックに発生し、特定の情報の形式で表示さを示しています。

例外処理

次の例では、ユーザーが有効な整数を入力することができますが、ユーザが(Control-Cをまたは提供するオペレーティングシステムのメソッドを使用して)プログラムを中断することができます。 ユーザーの中断は、KeyboardInterrupt例外が発生します。

>>> while True:
        try:
            x = int(input("Please enter a number: "))
            break
        except ValueError:
            print("Oops!  That was no valid number.  Try again   ")
   

次のように文の作品を試してみてください。

  • (try文を除いて、キーワードとキーワードの間)まず、try節
  • 例外が発生しない場合を除い句は無視され、句が実行された端をしてみてください。
  • 例外はtry節の手順で発生した場合、句を試して、残りは無視されます。 試合後除いて、例外の名前とタイプした場合、except節対応が実行されます。 コードは、最後の実行後に声明を試してみてください。
  • 例外は除いていずれかと一致しない場合、この例外は、上部のtryに渡されます。

try文は異なる特定の例外に対処するために、except節つ以上を含有することができます。 最大1つのブランチで実行されます。

のみ対応するtry節例外処理ではなく、他のtry例外ハンドラのハンドラ。

except節例えば、タプルとして括弧内に配置されます複数の例外を処理することができます。

    except (RuntimeError, TypeError, NameError):
        pass

except節の最後には、例外の名前を無視してもかまいません、それはワイルドカードとして扱われます。 あなたは、エラーメッセージを表示するために、このメソッドを使用して、再度スローすることができます。

import sys

try:
    f = open('myfile.txt')
    s = f.readline()
    i = int(s.strip())
except OSError as err:
    print("OS error: {0}".format(err))
except ValueError:
    print("Could not convert data to an integer.")
except:
    print("Unexpected error:", sys.exc_info()[0])
    raise

文は、この句を使用する場合、句を除いてすべての後に配置する必要があり、オプションのelse節を持つ除いてみてください。 この句は、try節が実行中に何らかの問題が発生していません。 例えば:

for arg in sys.argv[1:]:
    try:
        f = open(arg, 'r')
    except IOError:
        print('cannot open', arg)
    else:
        print(arg, 'has', len(f.readlines()), 'lines')
        f.close()

いくつかの予期しないを避けるために優れているtry節内のすべてのステートメントよりもelse節を使用しますが、彼らは例外をキャッチしていない点が異なります。

例外処理は、直接的にのみ句を試して発生これらの例外に対処するだけでなく、スローハンドラ句(あっても間接的な関数呼び出し)を呼び出すことではありません。 例えば:

>>> def this_fails():
        x = 1/0
   
>>> try:
        this_fails()
    except ZeroDivisionError as err:
        print('Handling run-time error:', err)
   
Handling run-time error: int division or modulo by zero

例外をスロー

Pythonは指定された例外を発生させるthrowステートメントを使用しています。 例えば:

>>> raise NameError('HiThere')
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
NameError: HiThere

一つのパラメータのみがスローされる例外を指定上げます。 これは、クラスまたは異常な(すなわち、例外サブクラス)の珍しいインスタンスである必要があります。

あなたはそれが例外をスローした場合、それに対処する必要はありません知りたい場合は、単純な文は再び投げ、それを上げることができます。

>>> try:
        raise NameError('HiThere')
    except NameError:
        print('An exception flew by!')
        raise
   
An exception flew by!
Traceback (most recent call last):
  File "<stdin>", line 2, in ?
NameError: HiThere

ユーザー定義の例外

新しい例外クラスを作成することで、独自の例外を持つことができます。 例外は、例えば、間接的にExceptionクラスから継承し、直接相続、連続または必要があります。

>>> class MyError(Exception):
        def __init__(self, value):
            self.value = value
        def __str__(self):
            return repr(self.value)
   
>>> try:
        raise MyError(2*2)
    except MyError as e:
        print('My exception occurred, value:', e.value)
   
My exception occurred, value: 4
>>> raise MyError('oops!')
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
__main__.MyError: 'oops!'

この例では、クラスExceptionのデフォルト__init __()が上書きされます。

異常な一般的な方法の様々なをスローすることがあり、モジュールを作成する場合は、このパッケージのベース例外クラスを作成することですし、別のエラー条件のための異なるサブクラスを作成するには、この基本クラスに基づいて:

class Error(Exception):
    """Base class for exceptions in this module."""
    pass

class InputError(Error):
    """Exception raised for errors in the input.

    Attributes:
        expression -- input expression in which the error occurred
        message -- explanation of the error
    """

    def __init__(self, expression, message):
        self.expression = expression
        self.message = message

class TransitionError(Error):
    """Raised when an operation attempts a state transition that's not
    allowed.

    Attributes:
        previous -- state at beginning of transition
        next -- attempted new state
        message -- explanation of why the specific transition is not allowed
    """

    def __init__(self, previous, next, message):
        self.previous = previous
        self.next = next
        self.message = message

名前の多くは、単に異常などの標準的な命名のように、末尾に「エラー」の例外です。


定義されたクリーンアップ動作

try文は、どのような状況下でのクリーンアップ動作が実行されます定義し、別のオプション句を持っています。 例えば:

>>> try:
        raise KeyboardInterrupt
	finally:
        print('Goodbye, world!')
   
Goodbye, world!
KeyboardInterrupt

かかわらず、上記の例のは、finally節が実行され、例外が発生しないあり、句を試してみてください。

try節内(または除くとelse節)例外が投げたが、それは停止以外の任意のを持っていない場合はfinally節が実行された後、これが再び発生します。

ここで(except節、最後に試しに同じ文に含まれている)より複雑な例は次のとおりです。

>>> def divide(x, y):
        try:
            result = x / y
        except ZeroDivisionError:
            print("division by zero!")
        else:
            print("result is", result)
        finally:
            print("executing finally clause")
   
>>> divide(2, 1)
result is 2.0
executing finally clause
>>> divide(2, 0)
division by zero!
executing finally clause
>>> divide("2", "1")
executing finally clause
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "<stdin>", line 3, in divide
TypeError: unsupported operand type(s) for /: 'str' and 'str'

事前定義されたクリーンアップ動作

いくつかのオブジェクトは関係なく、システムが正常にそれが一度それを必要としない使用されているかどうか、この標準の動作が実行されるクリーンアップ、標準的なクリーンアップ動作を定義します。

この例では、こちら側がファイルを開き、画面上のコンテンツを印刷しようと示しています。

for line in open("myfile.txt"):
    print(line, end="")

このコードで上記の問題は、ファイルが開いているときに終了し、閉じていないということです。

with文のキーワードは、ファイルなどのオブジェクトが彼のクリーンアップ方法の正しい実行の使用を終了することになります保証することができます。

with open("myfile.txt") as f:
    for line in f:
        print(line, end="")

上記のコードが終了した後、さらにプロセスに問題場合、ファイルfは常に閉じられています。