Python学習チャンネル by PyQ

Pythonのオンライン学習プラットフォームPyQのオフィシャルブログです

エンジニアの「プロの所作」02. エラーや問題の本質をまず知ろう(前編)

f:id:nana_yu:20190605130819p:plain

連載:エンジニアの「プロの所作」とは?

自分はプログラミング学習に向いていないのではないか

プロのエンジニアとして働いている姿が想像できない

そんなあなたに、ただコードを書くスキルだけではなく、普段プロのエンジニアがどのように考えて行動しているかをお伝えする連載です。

PyQは、Python学習者のあなたが「プロとして活躍できる」ということをサービス全体の目標として、 問題の作成、システムの構築、ユーザーの質問への回答、サポートを行っています。

そのサービス運営のポリシーを、Python学習者であるあなたと共有することで、 Python学習の先に目指しているものの一つ、「プロのエンジニア」という姿が明確になり、 不安が少しでも拭えればという思いで、連載を開始しました。

エンジニア「プロの所作」は14回の連載予定で、本記事は第2回です。 第2回は、前後編に渡ってお伝えし、本記事は前編となります。

自分主体で考えて作る - エラーや問題の本質をまず知る

PyQは、「自分主体で考えて作る」を実践するのが プロのエンジニアと考えています。

エラー思ったとおりに動かない 現象が出たときにまずは本質(原因)を知ることが大事です。

前編(今回)は「エラーが出る場合」の所作について説明します。
後編では「何をしたいのかを明確にしよう」という説明をします。

プログラムを実行するとエラーが発生することがあります。
エラーには、 構文エラー (プログラムの決まりを守って記述できていない)、
例外 (文法には問題がないが、実行するとエラーが発生する)などがあります。
どちらも実行するとエラーが表示されます。

エラーの例

https://images.pyq.jp/python_first/NameError.png

エラーが出ると、コードを見てすぐに修正したくなります。しかし、まずはエラーを読みましょう

なぜ、エラーを読むべきなのでしょうか?

エラーには 意味がある情報 が含まれています。闇雲にコードの修正を行うとエラーと関係のない箇所を修正してしまうかもしれませんし、時間がかかります。 エラーを読むことがエラーを解決する近道 なのです。原因がわかれば、エラー対応の8割は完了しています。

構文エラーを読んでみよう

例のエラーを読んでみましょう。

エラーを読んでみよう

Traceback (most recent call last):
  File "print_name.py", line 2, in <module>
    prant('鈴木さん')
NameError: name 'prant' is not defined

エラーの内容を確認

Pythonが出力するエラーは一番下にエラーの内容が書いてあります。 上の場合は、 NameError: name 'prant' is not defined の部分です。

エラーの種類を確認

NameError はエラーの種類です。公式ドキュメントで検索できます。 組み込み例外 - NameError 公式ドキュメントには「ローカルまたはグローバルの名前が見つからなかった場合に送出されます。」と書いてあります。

エラーの起こった原因を確認

name 'prant' is not defined は具体的なエラーが起こった原因です。

'prant'という名前が定義されていない」という意味になります。

エラーの英語の意味が理解できない時は?

エラーの内容は英語で出力されます。英語の意味が理解できない場合は、Google翻訳などの翻訳サービスを使って翻訳してみましょう。name 'prant' is not definedを翻訳すると、「名前 'prant'が定義されていません」と表示されます。

ここまで確認できたら、'prant' が定義されていないのが原因だろうと予想できます。

エラーの起きている場所の確認

次にエラーが起きている場所を確認します。 File "print_name.py", line 2, in <module> の部分を見ると、"print_name.py"ファイル中の line 2 (2行目)で発生してることを示しています。

2行目を確認すると、 prant('鈴木さん') と書いてあり、 print() 関数の綴間違いだとわかりました。この例は、構文エラーの例でした。

例外エラーを読んでみよう

今度は、実際にコードを実行してエラーを確認してみましょう

コードを実行してみよう

    def func(a, b):
        answer = a / b
        return answer
    
    print(func(1, 0))

エラー画面の確認

http://images.pyq.jp/python_first/ZeroDivisionError.png

ZeroDivisionError が発生しました。除算や剰余演算の第二引数が 0 であった場合に発生する例外です。

例外のエラーの場合は、場所の確認後にエラーを再現させます。

エラーを再現する意味

エラーを再現することは重要です。

毎回再現しない場合は、再現する条件をさらに調べます。データの状態だったり、実行するタイミングが影響している場合もあります。エラーを確実に再現でき、原因が確定するまで調査しましょう。 エラーの原因が確定しないと修正もできませんし、修正後に治ったか確認もできません。

エラーを再現し、修正する

エラーを再現してみよう

  1. 5行目を`print(func(2, 1))`に変更して実行してみよう
  2. 5行目を`print(func(2, 0))`に変更して実行してみよう

2の場合でエラーが再現しました。 例では、変数bに 0 を渡すとエラーが再現します。 このため、関数の中に変数bに 0 が渡された場合の処理を追加することでエラーが発生しなくなります。

理解できないエラーが発生した時は

新しいライブラリを使った場合などは理解できないエラーが発生する場合があります。 その場合は同じエラーで困っている人が世界中にいる可能性が高いです。まずはエラー文をコピーして検索してみましょう。

ここまでの行動を実行し、解決しない場合は周りの先輩や相談できる場所で相談しましょう。自分だけで考えて時間をかけすぎないようにします。調査を開始する場合に「30分調べてめどが立たない場合は相談する。」など、時間で区切って決めておくとよいです。

エラーが出た瞬間にエラーの内容も読まず、同僚や先輩のところへ行って「なんだか、動かないんですけど。」と相談すると先輩も少し困ってしまいます。

一人前のプロになるために、エラーの原因を分析して解決(またはその上で相談)できるようになりましょう!

Copyright ©2017- BeProud Inc. All rights reserved.