Japanese subtitles

← 06x-03 Exceptional Control Flow

Get Embed Code
3 Languages

Showing Revision 1 created 10/23/2014 by Udacity.

  1. 講義で作ったJavaScriptインタプリタでは
    return文の実装に例外を用いましたが
  2. これは悪いやり方ではないしょうか?
    そうしてまでPythonを使うべきなのでしょうか?
  3. 現実には多くの言語レベルでの例外処理があります
  4. Pythonを避けたり ある言語が他の言語より
    危険だとする理由にはならないと思います
  5. 言語レベルでの例外処理はとても一般的です
  6. 歴史的には1975年の
    グッドイナフの論文にまでさかのぼれます
  7. すごい姓ですね 私もこんな名前だったらよかった
  8. それ以来 さまざまな言語がプログラマのエラーや
    環境を扱えるような機能を取り入れ
  9. その両方が言語レベルでの例外という
    カテゴリに収まりました
  10. それ以前はグローバルなフラグの管理という
  11. きちんと管理して覚えておくのが難しい方法しか
  12. なかったような処理を簡単にしてくれました
  13. 言語レベルでの例外処理があったとしても
    プログラマは間違いをたくさん犯します
  14. 私の個人的な仮説としては
  15. 例外の制御フローは目に見えないからだと思います
  16. コードを読む時
    制御は1行ずつ下に移るとわかります
  17. Pythonならインデントで文がわかります
  18. しかし例外は大域ジャンプを扱うため
  19. コードのインデントや構造からは
    明らかになりません
  20. そしてコードの処理が他へ飛んでいったりすると
  21. 注意していないと ある変数を再初期化したり
    ファイルを閉じてファイナライズするといった
  22. コードの最後の処理を忘れてしまうのです
  23. つまらない話で恐縮ですが
    実は数年前にも 私のある研究論文で
  24. オープンソースのプログラマは
    400万行につき800箇所も
  25. 例外処理に関する間違いを犯すという
    調査結果が出ました
  26. よくあるプログラムでは
    例外処理というのは目立つものです
  27. プログラム中の1~5%は
    catchとfinallyのブロックが占めます
  28. 一見低く思えますが
    空でないcatchやfinallyのブロックは
  29. エラー処理のルーチンを呼び
    大きなソフトウェアともなると
  30. 3~46%の部分がcatchやfinally節の呼び出しから
  31. たどれる部分になるのです
  32. もし実際に使われている大きく堅牢なプログラムを
    書くことに興味があるなら
  33. 結構な時間をエラー処理に費すことになります
  34. 言語レベルでの例外処理は
  35. 今のところ他の代替手段に比べてとてもよいです
  36. これはPythonを避ける理由になるでしょうか?
  37. PythonでのJavaScriptインタプリタ内で
  38. 講義で見たように return文を扱うために
    例外処理を使うこともできます
  39. Pythonを避ける理由にはなりませんね
  40. 実は より初心者に優しいといわれている
    Javaのような言語の方が状況が悪いです
  41. Javaはいまだにgotoがあります
    調べてみてください
  42. Javaではラベルを書いてbreak文でラベルを
    再利用し gotoのように使うこともできます
  43. 一般には名目上より型安全で
  44. より構造化された言語は
    そのような言語機能を避けますが
  45. 実際にはJavaでもPythonでも秘密の暗部があって
  46. 構造化されてないスパゲッティコードを
    書くことができます
  47. しかしこれらが特に
    PythonやJavaScriptの悪い点ではなく
  48. エラーを見つけた時に時間がなかったり
    それに対処できるだけの文脈がなかったりする時
  49. どうするかという ほとんど哲学的な問題なのです
  50. それが例外処理の目的です
  51. ある低レベルな部分のコードで
    ファイルを書き出すのに失敗したり
  52. ネットワークで送信するのに失敗した時
    再試行するべきかはわかりません
  53. それはアプリケーションの
    他の部分によるからです
  54. ネットワークの操作プログラムならば
    5秒待って再試行するかもしれませんし
  55. SkypeのようなIP音声通信ならば
  56. 気にせず次のパケットの受信を待つかもしれません
  57. アプリケーションの意味や
    機能を知らないとわからないのです
  58. その情報を知っているところが
    キャッチしてくれるように例外を投げるのです
  59. これが例外の一般的な機能であり
  60. PythonやJavaやJavaScriptのような
    特定の言語の機能ではありません