例外
例外とは
Python はスクリプト実行中に、何かのエラーや、処理を中断すべき事情がある場合に例外を送ります。
例外が発生すると、以下の方法で補足しない限り、例外が発生した場所でスクリプトの実行を中止します。
ビルトイン例外
Python に元から入っている例外をビルトイン例外といいます。
- SyntaxError
- 文法に間違いがある場合など。
(例)
>>> def func1() # : を忘れている
File "", line 1
def func1()
^
SyntaxError: invalid syntax
- ZeroDivisionError
- 0 で除算をした場合など。
(例)
>>> 3/0 # 3 を 0 で除算
Traceback (most recent call last):
File "", line 1, in ?
ZeroDivisionError: integer division or modulo by zero
- IndexError
- リスト・タプルなどで存在しないインデックスを与えた場合など。
(例)
>>> list1 = [0, 1, 2] # リストのインデックスは 2 まで
>>> print list1[3] # リストに存在しないインデックス 3 にアクセス
Traceback (most recent call last):
File "", line 1, in ?
IndexError: list index out of range
- KeyError
- 辞書などで存在しないキーを与えた場合など。
(例)
>>> dict1 = {'a':1, 'b':2, 'c':3} #
>>> print dict1['d'] #
Traceback (most recent call last):
File "", line 1, in ?
KeyError: 'd'
- ValueError
- 関数の引数に与えてはならない型のものを与えた場合など。
(例)
>>> int('test') # 数値を引数に取る int() 関数に文字列を与えた
Traceback (most recent call last):
File "", line 1, in ?
ValueError: invalid literal for int(): test
- TypeError
- 文字列と数値などを + で連結しようとしたときのように、
演算できないもの同士を使った計算をしようとしたときなど。
(例)
>>> 'test' + 3 # 文字列と数値を + で演算
Traceback (most recent call last):
File "", line 1, in ?
TypeError: cannot concatenate 'str' and 'int' objects
- NameError
- 変数や関数名が見つからないときなど。
(例)
>>> func100() # 存在しない関数 func100() を実行
Traceback (most recent call last):
File "", line 1, in ?
NameError: name 'func100' is not defined
例外の例
例 1
例外の使用例
例外を使って簡単な実験をして見ます。
Python では例外が発生すると、そこで実行がとまってしまいますが、
try と except
を使用することで実行を継続することができます。
- 以下の Python スクリプトを except1.py という名前で作ります。
import pymel.core as pm
def makeObj(num):
objs = [pm.sphere, pm.cone, pm.cylinder]
objs[num]()
def createObjs():
for i in range(3, -1, -1):
try:
makeObj(i)
except IndexError:
print i," is not correct"
else:
print i," is ok"
- スクリプト エディタ の によって except1.py を読み込んで、テンキーの Enter キーなどで実行します。
- スクリプト エディタ のインプットウインドウで以下のように実行してみます。
>>> createObjs()
3 is not correct
2 is ok
1 is ok
0 is ok
スクリプトの解説
import pymel.core as pm
- Maya モジュールをインポートします。
def makeObj(num):
- makeObj という関数を定義します。
引数の num は、作成するプリミティブの番号を表します。
objs = [pm.sphere, pm.cone, pm.cylinder]
- リストにプリミティブを作成する関数を並べます。
Python では、関数もリストの要素になります。
objs[num]()
- リスト objs の num 番目の関数を実行します。
def createObjs():
- createObjs という関数の定義です。
for i in range(3, -1, -1):
- 変数 i に 3 から 0 までの int を代入してループを 4 回実行します。
range(3, -1, -1) は [3, 2, 1, 0]
というリストを作成する関数です。
try:
makeObj(i)
- makeObj(i) を実行して、例外が上がると下の except で補足します。
ループの最初に i が 3 なので、
リスト objs の範囲を超えてしまうので、例外 IndexError が発生します。
通常は、例外が発生した時点で実行が中断されるので、
i が 2, 1, 0 の場合は実行されないままですが、
try と except があるので実行が中断されません。
except IndexError:
print i," is not correct"
- IndexError という例外が上がってきたら、
print を実行します。
IndexError 以外の例外が上がってきた場合は、
ここで補足される事は無くて、通常のエラーメッセージを表示します。
else:
print i," is ok"
- 例外が上がってこなかったら、
この print を実行します。
練習
- 上の except1.py を参考にして except2.py という Python スクリプトを作り、
except2.py 中の makeObj() 関数を書き直して、
作成したプリミティブをスケールできるようにしてみましょう。
def makeObj(num, sv):
- num
- 作成するプリミティブの番号
- sv
- スケール値
作成したプリミティブが X, Y, Z 方向に 1.0/sv 倍スケールされるようにします。
この except2.py を読み込んで、makeObj() を実行したときに、
sv が 0 の場合も例外を補足して実行が続くようにしてみましょう。
(実行例)
- createObjs() の for 文を以下のように書き換えます。
for i in range(3, -1, -1):
for j in range(3):
print i,j
- 同じく、createObjs() の makeObj(num) を以下のように書き換えます。
makeObj(i, j)
- その他、必要な変更を except2.py に加えます。
- スクリプト エディタ の によって except2.py を読み込んで、テンキーの Enter キーなどで実行します。
- スクリプト エディタ のインプットウインドウで以下のように実行してみます。
>>> createObjs()
3 0
0 is zero
3 1
3 is not correct
3 2
3 is not correct
2 0
0 is zero
2 1
2 1 is ok
2 2
2 2 is ok
1 0
0 is zero
1 1
1 1 is ok
1 2
1 2 is ok
0 0
0 is zero
0 1
0 1 is ok
0 2
0 2 is ok
- 以下のように 6 個のプリミティブが作成されます。
参考
Prev
Home | Contents
Mail