例外

例外とは

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 では例外が発生すると、そこで実行がとまってしまいますが、 tryexcept を使用することで実行を継続することができます。

  1. 以下の Python スクリプトを except1.py という名前で作ります。
    import pymel.core
    
    def makeObj(num):
        objs = [pymel.core.sphere, pymel.core.cone, pymel.core.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"
    
  2. スクリプト エディタ の ファイル → スクリプトのロード によって except1.py を読み込んで、テンキーの Enter キーなどで実行します。
  3. スクリプト エディタ のインプットウインドウで以下のように実行してみます。
    >>> createObjs()
    3 is not correct
    2 is ok
    1 is ok
    0 is ok

スクリプトの解説

import pymel.core
Maya モジュールをインポートします。
def makeObj(num):
makeObj という関数を定義します。
引数の num は、作成するプリミティブの番号を表します。
objs = [pymel.core.sphere, pymel.core.cone, pymel.core.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 の場合は実行されないままですが、 tryexcept があるので実行が中断されません。
except IndexError:
  print i," is not correct"
IndexError という例外が上がってきたら、 print を実行します。
IndexError 以外の例外が上がってきた場合は、 ここで補足される事は無くて、通常のエラーメッセージを表示します。
else:
  print i," is ok"
例外が上がってこなかったら、 この print を実行します。

練習

  1. 上の 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 の場合も例外を補足して実行が続くようにしてみましょう。
    (実行例)
    1. createObjs()for 文を以下のように書き換えます。
              for i in range(3, -1, -1):
                  for j in range(3):
                      print i,j
          
    2. 同じく、createObjs()makeObj(num) を以下のように書き換えます。
          makeObj(i, j)
          
    3. その他、必要な変更を except2.py に加えます。
    4. スクリプト エディタ の ファイル → スクリプトのロード によって except2.py を読み込んで、テンキーの Enter キーなどで実行します。
    5. スクリプト エディタ のインプットウインドウで以下のように実行してみます。
      >>> 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. 以下のように 6 個のプリミティブが作成されます。

参考


Prev | Next
Home | Contents
Mail