CodeGym /コース /Python SELF JA /スクリプトの安定動作のためのログとエラーハンドリング

スクリプトの安定動作のためのログとエラーハンドリング

Python SELF JA
レベル 38 , レッスン 0
使用可能

1. ログ

今日は、おそらく君の神経と貴重な時間をかなり救ってくれる話題、「ログ」と「エラーハンドリング」について深く掘り下げていくよ。たとえすごく経験のあるプログラマーでも失敗は避けられないものだから、それらを予測可能で管理可能にするのが君の課題だよ。自分が発掘の冒険をする考古学者だとして、チームを予期せぬ崩壊や危険な罠から守るのが君の仕事だと想像してみて。それが、この冒険でリスクを回避するための頼りになる羅針盤、「ログ」と「エラーハンドリング」なんだ!

プログラミングにおいてログについて話すとき、それはプログラムの動作に関する情報を記録するプロセスを意味しているよ。コードの中で行われているけど、一目では見えないプロセスだよ。ログを記録することで、ヘンゼルとグレーテルがお菓子の家に戻るためにパンくずを残したように、自分自身にもヒントを残すことができるんだ。

ログのセットアップと設定

Pythonの基本的なツールから始めよう。ログには組み込みのモジュール、loggingを使うよ。これはプログラムの進行状況を記録するためのスイスアーミーナイフみたいなものだね。

Python

import logging

# ログの設定
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

# 使用例
logging.info("スクリプトの開始")
logging.error("これはエラーです")

        

ログレベルには何種類あるの?

  • DEBUG: 最も詳細な情報。通常、問題を診断する際にだけ興味深い。
  • INFO: プロセスが期待通りに動作していることを確認するためのもの。
  • WARNING: 予想外のことや潜在的な問題を示すが、プログラムはまだ動作している。
  • ERROR: 関数の実行が失敗するような重大なエラー。

ログレベルを設定して情報をフィルタリングすることもできるよ。例えば、エラーや警告だけを知りたい場合は、logging.WARNINGレベルを設定してね。

Seleniumでのログの例

Seleniumプロジェクトでログがどのように使われるか見てみよう:

Python

from selenium import webdriver

# ログの設定
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

try:
    logging.info("Chromeドライバーを初期化しています")
    driver = webdriver.Chrome()
    logging.info("Python.orgのページを開いています")
    driver.get("https://www.python.org")
    logging.info("作業を正常に終了しました")
except Exception as e:
    logging.error(f"エラーが発生しました: {e}")
finally:
    driver.quit()

        

これは、Seleniumスクリプトの実行を追跡するためにログを統合する方法を示しているよ。try, except, finallyを使うことで、エラーを処理できるよ — このことについては以下で詳しく説明するね。

2. Seleniumでのエラーハンドリング

プログラミングでも人生でも、エラーは避けられないよ。でも、エラーが発生したときどう対処するかをコントロールすることができるんだ。try, except, else, finallyを使うと、エラーをうまくキャッチして処理することができるよ。

例外処理の復習

例外処理がどう動くか復習してみよう:

Python

try:
    # 例外が発生する可能性のあるコード
    result = 10 / 0
except ZeroDivisionError as e:
    # ZeroDivisionError例外が発生した場合に実行されるコード
    logging.error("ゼロ除算はできません!")
else:
    # 例外が発生しなかった場合に実行されるコード
    logging.info("操作が正常に完了しました")
finally:
    # 例外があってもなくても必ず実行されるコード
    logging.info("操作が終了しました")

        

tryブロック内のコードが実行されるよ。ZeroDivisionErrorのエラーが発生すると、exceptブロックのコードが実行されて、プログラムはクラッシュしないよ。elseブロックは、例外が発生しなかった場合に実行されるよ。最後に、finallyブロックはエラーがあってもなくても常に実行されるよ。

Seleniumでのエラーハンドリング

Seleniumには、さまざまな状況を処理するための組み込み例外がいくつかあるよ。便利な例外の例とその使い方を見てみよう。

  1. NoSuchElementException — 要素が見つからない場合に発生する例外。要素が存在するかどうか確認するために使うよ。
    Python
    
    try:
        element = driver.find_element(By.ID, "element_id")
    except NoSuchElementException:
        logging.warning("ID 'element_id' の要素が見つかりませんでした。")
    
                    
  2. TimeoutException — 期待された要素が設定された時間内にページに現れない場合に発生。待機を管理する時に使用。
    Python
    
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    try:
        element = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.ID, "element_id"))
        )
    except TimeoutException:
        logging.error("ID 'element_id' の要素の待機がタイムアウトしました。")
    
                    
  3. ElementClickInterceptedException — 他の要素に遮られて要素がクリックできない場合に発生。この例外は、ポップアップで覆われた要素をクリックする際に便利だよ。
    Python
    
    from selenium.common.exceptions import ElementClickInterceptedException
    
    try:
        driver.find_element(By.ID, "button_id").click()
    except ElementClickInterceptedException:
        logging.warning("他の要素に遮られてクリックできません。")
    
                    

再試行とリカバリーマニュアル

スクリプトの安定性を向上させるには、エラー発生時に再試行する仕組みを実装すると良いね。例えば、サイトが一時的に利用不可だったり、要素が見つからなかった場合、エラーが発生する前に数回動作を試みることができるよ。

Python

import time

def retry_find_element(driver, by, value, retries=3):
    attempt = 0
    while attempt < retries:
        try:
            element = driver.find_element(by, value)
            logging.info(f"要素が見つかりました: {value}")
            return element
        except NoSuchElementException:
            attempt += 1
            logging.warning(f"試行 {attempt} が失敗しました。2秒後に再試行します...")
            time.sleep(2)
    logging.error(f"{retries}回試しても要素が見つかりませんでした。")
    return None

        

スクリプトの信頼性と安定性向上のためのヒント

  • 明示的な待機を使おう: 明示的な待機を設定して、すぐに現れない要素を待つことで、読み込みの遅れによるエラーを減らせるよ。
  • すべてのステップでtry-exceptブロックを使おう: エラーをログに記録して、小さい失敗でスクリプトが停止しないようにするよ。
  • 重要なステップでは再試行を取り入れよう: 一時的なエラーの場合、数秒間隔での再試行を設定すると良いね。
  • 各ステップをログに記録しよう: スクリプトの進行状況を分析し、隠れたエラーを見つけるのに役立つよ。
  • 重大なエラーを通知する仕組みを設定しよう: 例えば、CRITICALレベルのエラーがログに記録された場合、メールやメッセージを送るよう設定してみて。

3. ログを有効活用しよう

ログの記録とエラーハンドリングを学んだ今、さらに一歩進んで、ログをどうやって最大限に活用するかを見てみよう。

ログの保存場所とフォーマットの選択

分析するためにログを保存したい場合は、ファイルに記録するのがおすすめだよ。これは、未来のミスを避けるために読み返して分析できる日記みたいなものさ。ログをファイルに書き込む方法を設定しよう:

Python

logging.basicConfig(filename='app.log', filemode='w', level=logging.INFO)

# これからすべてのログはapp.logに保存されるよ
logging.info("ログをファイルに記録開始")

        

ログ分析

ログを分析して、よく発生するエラーやパフォーマンスの問題を特定しよう。スクリプトが特定の日や時間にだけ問題に直面しているかもしれないし、それはログを詳細に研究しないと気づけないこともある。これを分析するのは、アプリケーションの動作をよりよく理解するための君自身の探偵プロセスだね。

コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION