おえぷろべい

お絵かきとかプログラミングとか米国株投資についてのなんやかんや

raise文と独自例外について(Python)

f:id:feci:20210726231508j:plain

Python3

 

Python3.8.5でのraise文について。

#①raise文で特定の例外を発生
raise IndexError('エラーです')  #IndexErrorの例外を発生
raise NameError('エラーです')   #NameErrorの例外を発生

raise文は、意図的に特定のErrorを発生させるための方法です。

上記のように書くことで、特定のエラーと独自にエラーメッセージを発生させることができます。

 

 

raise文の定形は以下のとおりです。

 

raise エラーの種類('独自のエラーメッセージ')

 

 

独自例外の作成について。

#②classで独自の例外の作成
class AbcError(IndexError):         #IndexErrorをAbcErrorに置き換え
  pass

def aaa():                          #関数aaa
  a = ['Apple''orange''TOMATO'#変数aと配列
  for b in a:                       #変数aの値をfor文で1つずつbに代入
    if b.isupper():                 #変数bの値がすべて大文字英字だったらtrue
      raise AbcError('例外だよ。')  #AbcErrorの発生

try:                                #例外のキャッチ
  aaa()                             #関数aaaの実行
except AbcError as bbb:             #例外がAbcErrorだった際にエラーメッセージの変数代入と下行の実行
  print('独自のエラーです。'bbb)  #独自のエラーです。例外だよ。

上記②のスクリプトのように、classを使うことで既存のErrorをオリジナルの名前のErrorに置き換えることができます。

 

aaa関数内のif文のisupper関数は、パラメータの値がすべて大文字英字だった場合にtrueを返します。

なので②のスクリプトではforループの3個目のTOMATOでif文の条件が満たされ、その時点でraise文によってAbcErrorの例外が発生します。

 

一応確認してみましたが、独自Errorを作るための「class 独自Error名(既存Error名):」の既存Error名の部分には、IndexErrorを入れようがTypeErrorを入れようが、実際の発生するErrorの種類に関係なく何でもいいようです。

 

あと、もしclassを使ってIndexErrorを別の名前の独自Errorに置き換えたところで、同一のファイル内からIndexErrorが消えてしまうわけではありません。

上記②のスクリプトの後にIndexErrorが発生する状況をつくれば、通常どおりPythonはIndexErrorを出して問題の場所でスクリプトを停止します。

 

IndexErrorをAbcErrorに置き換えたあとは本来IndexErrorが出るはずだった状況ではすべて代わりにAbcErrorが出てくる、といったようなことはありません。

ちゃんとIndexErrorが出てきます。

 

 

以上です。