0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Python3エンジニア基礎試験_模擬試験の復習⑧

Last updated at Posted at 2023-06-17

エラーと例外について

● エラーの種類

エラーの種類は数多くありますが、基本的には、構文エラー例外に分類できます。
構文エラー例外について復習していきます。

構文エラーとは

構文エラー(SyntaxError)とは、構文が間違っていることで発生するエラーです。

構文が誤っていると、SyntaxErrorとのエラーが表示されます。

syntax_error.py
print(
#     print(
#          ^
# SyntaxError: incomplete input

また、インデントが不適切な場合も構文エラーが発生します。
インデントが不適切な場合、IndentationErrorとのエラーが表示されます。

syntax_error.py
for i in range(5):
print("Hello") # インデントがない
#    print("Hello")
#    ^
# IndentationError: expected an indented block after 'for' statement on line 1

例外とは

コードを実行した際、構文以外でエラーが検知された場合もエラーが発生することがあります。
この場合に発生するエラーを例外と言います。

※代表例

  1. ZeroDivisionError

  1. NameError

  1. TypeError

  1. ValueError

ZeroDivisionError.py
3 / 0
# ZeroDivisionError: division by zero
NameError.py
name ** 2
# NameError: name 'name' is not defined
TypeError.py
"abc" + 3
# TypeError: can only concatenate str (not "int") to str
ValueError.py
int("Hello World")
# ValueError: invalid literal for int() with base 10: 'Hello World'

例外処理について

● try文

try文を使用することで、特定の例外が発生した際の処理を指定できます。

try.py
while True:
    try:
        x = int(input("数字を入力してください:")) # 検証したいコード
    except ValueError: # 起こりうるエラーの名前
        print("入力に誤りがあります。もう一度入力してください。") # 起こりうるエラーが起きたときの処理
    else:
        break

● raise文

raise文を使って強制的に例外を発生させることもできます。

raise.py
raise TypeError("raise文のテスト")
# TypeError: raise文のテスト 

例外が発生した際に特定の処理を実行した後で、再度例外を表示させたい場合は
例外処理の後にraiseを記述します。例外が発生した際に、ログを記録として残した後で再び例外を出力したい場合などに有効です。

raise.py
try:
    x = int(input("数字を入力してください:")) # 検証したいコード
except ValueError: # 起こりうるエラーの名前
    print("入力に誤りがあります。もう一度入力してください。") # 起こりうるエラーが起きたときの処理
    raise
# 数字を入力してください:a
# 入力に誤りがあります。もう一度入力してください。
# ValueError: invalid literal for int() with base 10: 'a'

※ raise文について、追記予定

問題

下記の実行結果を求めよ

raise.py
print("出力結果:")
try:
  raise Exception("開始前","Exception発生")
  print("開始")
except IOError as msg:
  print("IOError発生:",msg.args[0])
except Exception as msg:
  print("予期せぬ問題発生:",msg.args[1])
else:
  print("Else表示")
# 出力結果:予期せぬ問題発生: Exception発生

● 解説

  1. 最初に、"出力結果:"という文字列が表示されます。
  2. try:ブロックが開始されます。
  3. raise Exception("開始前", "Exception発生")が実行されます。この行により、Exceptionという種類の例外が発生します。例外は引数として2つの文字列を持っています。
  4. except IOError as msg:に移動しますが、IOErrorの例外は発生していないため、このブロックはスキップされます。
  5. except Exception as msg:に移動します。ここで発生した例外は、先ほどのraise文で発生したExceptionです。Exceptionの例外はキャッチされ、msgという変数に例外の情報が代入されます。
  6. print("予期せぬ問題発生:", msg.args[1])が実行されます。この行では、例外の第2引数である"Exception発生"が表示されます。
  7. else:ブロックに移動しますが、前のexceptブロックが実行されたため、このブロックはスキップされます。
  8. プログラムの実行が終了します。

※注意点として、raise文で例外が発生すると、それ以降のコードは実行されず、例外処理が行われます。そのため、print("開始")は実行されずにスキップされます。

raise.py
try:
    raise NameError("Hello", "World")

except NameError as inst:
    print(inst.args[0])
    raise
# HelloとNameError

● 解説

  1. try:ブロックが開始されます。
  2. raise NameError("Hello", "World")が実行されます。この行により、NameErrorという種類の例外が発生します。例外は引数として2つの文字列を持っています。
  3. except NameError as inst:に移動します。ここで発生した例外は、先ほどのraise文で発生したNameErrorです。NameErrorの例外はキャッチされ、instという変数に例外の情報が代入されます。
  4. print(inst.args[0])が実行されます。この行では、例外の第1引数である"Hello"が表示されます。
  5. raise文が再度実行されます。これにより、現在の例外が再度発生します。
  6. プログラムの実行が終了します。
raise.py
try:
    raise ValueError
except ValueError:
  print("Hello World")
# Hello World

● 解説

  1. try::この行から始まるブロックは、例外が発生する可能性のあるコードを含んでいます。例外が発生すると、それに対応するexceptブロックが実行されます。
  2. raise ValueError:この行は、ValueErrorという種類の例外を発生させます。引数を指定せずにValueErrorを発生させたため、エラーメッセージはありません。
  3. except ValueError::この行は、ValueErrorという特定の種類の例外が発生した場合に実行されるコードを定義しています。
  4. print("Hello World"):この行は、ValueErrorが発生した場合に実行されるコードです。"Hello World"というメッセージが表示されます。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?