※当サイトの記事には、広告・プロモーションが含まれます。

Pythonの例外も捕捉しなければ呼び出し元に伝播されていくで良かったっけ?

gigazine.net

IPアドレスはネットワークに接続するPCやスマートフォンに割り当てられる識別番号で、世界にひとつだけでありどこからでもデータ送受信ができるグローバルIPアドレスと、ローカルネットワーク内で用いられるプライベートIPアドレスがあります。

プライベートIPアドレスに「192.168.x.x」が使われるようになった理由とは? - GIGAZINE

このうちプライベートIPアドレスでは「192.168.x.x」というIPアドレスがよく用いられますが、一体なぜ「192.168.x.x」が用いられるようになったのかについて、Q&AサービスのStack Exchangeで説明されています。

プライベートIPアドレスに「192.168.x.x」が使われるようになった理由とは? - GIGAZINE

IETFは標準的な仕様を記した文書・Request for Comments(RFC)を公開しており、この中では「192.168.00」~「192.168.255.255」がプライベートIPアドレス範囲として割り当てられています。

プライベートIPアドレスに「192.168.x.x」が使われるようになった理由とは? - GIGAZINE

1994年に公開された「RFC 1597」を確認すると、プライベートIPアドレス範囲は「10.0.0.0」~「10.255.255.255」、「172.16.0.0」~「172.31.255.255」、「192.168.0.0」~「192.168.255.255」という3つの範囲に割り当てられていることがわかります。

プライベートIPアドレスに「192.168.x.x」が使われるようになった理由とは? - GIGAZINE

なぜ「192.168.x.x」がプライベートIPアドレスの標準として選ばれたのかという質問に対し、あるユーザーはかつてIPアドレスなどのインターネット資源を管理していたプロジェクトグループ・Internet Assigned Numbers Authority(IANA)が関係していたと回答しています。

プライベートIPアドレスに「192.168.x.x」が使われるようになった理由とは? - GIGAZINE

IANAは1972年、南カリフォルニア大学情報科学研究所のジョン・ポステル教授が中心となって設立され、ポステル教授は1998年に亡くなるまでIANAの仕事を率先して引き受けていました。

プライベートIPアドレスに「192.168.x.x」が使われるようになった理由とは? - GIGAZINE

RFC 1597」に対する反論が含まれている「RFC 1627」では、IANAがプライベートIPアドレス範囲の割り当てを行ったと言及されています。これによるとIANA、つまりポステル教授はコミュニティのレビューと承認を得ることなく割り当てを行ったそうです。

プライベートIPアドレスに「192.168.x.x」が使われるようになった理由とは? - GIGAZINE

また、インターネットの歴史について議論するフォーラムのInternet-historyでは、あるネットワーク企業はIANAの割り当てが行われる以前から、「192.168.x.x」というIPアドレスを例としてネットワーク機器の説明書に記していたと報告されています。

プライベートIPアドレスに「192.168.x.x」が使われるようになった理由とは? - GIGAZINE

多くのユーザーがこの説明書に従って内部ネットワークを設定した結果、IANAの割り当て前からすでに相当数のプライベートネットワークで「192.168.x.x」が使われていたため、RFC 1597が採択された際にこのIPアドレスがプライベートIPアドレス範囲に割り当てられたとのことです。

プライベートIPアドレスに「192.168.x.x」が使われるようになった理由とは? - GIGAZINE

⇧ なるほど、結局のところ、よく分かっていないと。真相は藪の中といったところでしょうか...

Virtualbox」とかでも、

www.virtualbox.org

Table 6.1. Overview of Networking Modes

https://www.virtualbox.org/manual/ch06.html

⇧ 各々の「ネットワークアダプター」の「IPアドレス」の「範囲」が整理されていなかったり、「ネットワーク」周りの情報って整理されていないんよな...

そりゃあ、設定周りの誤設定で障害が起こっても文句は言えんわな...

Pythonの例外も捕捉しなければ呼び出し元に伝播されていくで良かったっけ?

Java」だと、

qiita.com

⇧ 上記サイト様にありますように、「例外」は「catch句」で捕捉しなければ呼び出し元に伝播されていくようなのだが、「Python」の場合ってどういう挙動になるんだっけ?と思ったので調べてみました。

ネットの情報を漁っていたところ、

qiita.com

⇧ 上記サイト様で解説してくれており、「Java」と同様に「Python」においても「例外」は伝播されていく挙動になるで良いようです。

ちなみに、

docs.python.org

docs.python.org

⇧ 公式のドキュメントには、複数のメソッドが呼び出される場合の「例外」の挙動についての言及が無いので、「例外」が伝播されていくという挙動が説明されていないのよね...

 

試してみた。

Pythonプロジェクト構成

D:\work-soft\python\exception_propagation
├─.venv
│  │  .gitignore
│  │  pyvenv.cfg
│  │
│  ├─Include
│  ├─Lib
│  │  └─site-packages
│  │      ├─pip

...省略

│  └─Scripts
│          activate
│          activate.bat
│          activate.fish
│          Activate.ps1
│          deactivate.bat
│          pip.exe
│          pip3.13.exe
│          pip3.exe
│          python.exe
│          pythonw.exe
│
└─src
    │  main.py
    │
    ├─client
    │      hoge.py
    │
    └─service
        └─notification
                email.py    

ソースコードは適当です。

■D:\work-soft\python\exception_propagation\src\client\hoge.py

class Hoge:

    def get_hoge_info(self):
        print("get_hoge_info")
        raise ValueError("error")
    
    def update_hoge_info(self):
        print("update_hoge_info")
        self.get_hoge_info()     

■D:\work-soft\python\exception_propagation\src\service\notification\email.py

class Email:
    def create_message(self):
      print("メッセージ作成")
      return "正常に処理されました。"

    def create_error_message(self):
      print("エラーメッセージ作成")
      return "異常が発生しました。"

    def send_email(self, message: str):
      print(message)
      print("Email送信")    

■D:\work-soft\python\exception_propagation\src\main.py

import traceback
from client.hoge import Hoge
from service.notification.email import Email

is_error: bool = False
try:
  hoge_client: Hoge = Hoge()
  hoge_client.update_hoge_info()
except Exception as e:
  is_error = True
  print("伝播されてきた例外捕捉")
  print(e)
  traceback.print_exc()

try:
  message: str = ""
  email_service: Email = Email()
  if is_error:
    print(f"エラーあり {is_error}")
    message = email_service.create_error_message()
  else:
    print(f"エラーなし {is_error}")
    message = email_service.create_message()
  
  email_service.send_email(message)
  print("正常に処理しました。")
except Exception as e:
  print("Email送信でエラー")  

⇧ で、保存。

ディレクトリ移動し、Python仮想環境にログイン。

コマンドプロンプトPython仮想環境にログイン

cd /d D:\work-soft\python\exception_propagation
.venv\Scripts\activate.bat

■「src」ディレクトリに移動して、「main.py」を実行

cd src
python main.py

■main.pyの実行結果

(.venv) D:\work-soft\python\exception_propagation>cd src

(.venv) D:\work-soft\python\exception_propagation\src>python main.py
update_hoge_info
get_hoge_info
伝播されてきた例外捕捉
error
Traceback (most recent call last):
  File "D:\work-soft\python\exception_propagation\src\main.py", line 8, in 
<module>
    hoge_client.update_hoge_info()
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
  File "D:\work-soft\python\exception_propagation\src\client\hoge.py", line 10, in update_hoge_info
    self.get_hoge_info()
    ~~~~~~~~~~~~~~~~~~^^
  File "D:\work-soft\python\exception_propagation\src\client\hoge.py", line 6, in get_hoge_info
    raise ValueError("error")
ValueError: error
エラーあり True
エラーメッセージ作成
異常が発生しました。
Email送信
正常に処理しました。

(.venv) D:\work-soft\python\exception_propagation\src>    

⇧ 呼び出し元である「main.py」に「例外」が伝播されているようです。

 

毎度モヤモヤ感が半端ない…

今回はこのへんで。