|
| 1 | +\documentclass[]{article} |
| 2 | + |
| 3 | +\usepackage{amsmath} |
| 4 | +\usepackage{amsfonts} |
| 5 | +\usepackage{amssymb} |
| 6 | +\usepackage{xcolor} |
| 7 | +\usepackage{url} |
| 8 | +\usepackage{graphicx} |
| 9 | +\usepackage{geometry} |
| 10 | +\usepackage[most]{tcolorbox} |
| 11 | + |
| 12 | +\usepackage{fontspec} % 加這個就可以設定字體 |
| 13 | +\usepackage{xeCJK} % 讓中英文字體分開設置 |
| 14 | +\setCJKmainfont{微軟正黑體} % 設定中文為系統上的字型,而英文不去更動,使用原 TeX 字型 |
| 15 | +\XeTeXlinebreaklocale "zh" % 這兩行一定要加,中文才能自動換行 |
| 16 | +\XeTeXlinebreakskip = 0pt plus 1pt % 這兩行一定要加,中文才能自動換行 |
| 17 | + |
| 18 | +\defaultCJKfontfeatures{AutoFakeBold=6,AutoFakeSlant=.4} %以後不用再設定粗斜 |
| 19 | + |
| 20 | +\setlength{\parindent}{0em} |
| 21 | +\setlength{\parskip}{3ex} |
| 22 | +\geometry{left=3cm, top = 3cm, right = 3cm, bottom = 3cm} |
| 23 | + |
| 24 | +\newcommand{\ignore}[1]{} |
| 25 | +\newcommand{\codequote}[1]{\colorbox{lightgray}{\tt #1}} |
| 26 | + |
| 27 | +\begin{document} |
| 28 | + |
| 29 | +\author{} \date{} |
| 30 | +\title{第 1 週,第 3 課:錯誤訊息和除錯} |
| 31 | +\maketitle |
| 32 | + |
| 33 | +\vspace{-2cm} |
| 34 | +----------------- |
| 35 | + |
| 36 | +\section*{目標} |
| 37 | +{\large |
| 38 | +\begin{description} |
| 39 | + \item[---] 學習閱讀錯誤訊息 |
| 40 | + \item[---] 學習逐行除錯方法 |
| 41 | +\end{description} |
| 42 | +} |
| 43 | +學完本課,你將能夠 |
| 44 | +\begin{description} |
| 45 | + \item[*] 在 Julia 的錯誤訊息中找到有用的資訊 |
| 46 | + \item[*] 在單行 Julia 代碼中查找錯誤並修復它們 |
| 47 | + \item[*] 逐行執行 Julia 代碼,在發現錯誤時修復它們 |
| 48 | + \item[*] 偶爾回去修復你錯過的錯誤 |
| 49 | +\end{description} |
| 50 | + |
| 51 | +\section*{除錯一些幾乎是第 1 課的代碼} |
| 52 | + |
| 53 | +假設我們錯誤地嘗試使用以下代碼運行第 1 課的練習\footnote{NB:如果你從新的 REPL 開始,這效果最好。 它包含拼寫錯誤,你應該小心地按原樣輸入下面的示例(拼寫錯誤及全部)。}. |
| 54 | + |
| 55 | +\codequote{mystiring1 = "Hello, world }\\ |
| 56 | +\codequote{prinln(mystring1) } |
| 57 | + |
| 58 | +你會發現它沒有辦法順利運行(並且,依照你嘗試運行它的方式,你可能會看到一個錯誤訊息)。 |
| 59 | + |
| 60 | +透過逐行檢查代碼,你可以找出原因。 在這裡,當我們嘗試從 REPL 運行第一行時,它停住了,沒有任何錯誤消息。你現在的工作是找出原因,並從仔細查看代碼開始。它是有效的代碼嗎?不是!沒有結束雙引號字符來指出字串值的結尾。 正如 Julia 所見,你仍然在字串中輸入字符\footnote{如果將這兩行放在 .jl 檔案中並嘗試使用 {\tt include()} 運行它,則會看到錯誤訊息 |
| 61 | +“LoadError: syntax: incomplete: invalid string syntax”,這會更有幫助,但不是很多。事實上,發生語法錯誤的方式有很多種,Julia 並沒有很努力地告訴你錯誤到底是什麼。}。 |
| 62 | + |
| 63 | +你可透過在結尾添加缺少的雙引號字符來修復該行。 |
| 64 | + |
| 65 | +在此有一個很好的技巧:在結束雙引號之後添加一個分號。 在 REPL 中,這會抑制該行的輸出,這意味著你需要閱讀的內容更少,干擾更少。 當然,在某些情況下,你會希望查看評估一行代碼的輸出,這並不總是正確的做法。 |
| 66 | + |
| 67 | +好的,現在代碼變成了 |
| 68 | + |
| 69 | +\codequote{mystiring1 = "Hello, world";}\\ |
| 70 | +\codequote{prinln(mystring1)} |
| 71 | + |
| 72 | +當我們在 REPL 運行第一行時,正如預期的那樣看不到輸出。 所以我們運行第二行。 哦親愛的。 螢幕上突然出現很多行訊息,其中一些是紅色的! |
| 73 | + |
| 74 | +以 \textcolor{red}{ERROR} 開頭的行是重要的\footnote{非常重要,以至於在大多數終端中它都顯示為鮮紅色。}:這是錯誤訊息。 在其中,Julia 為你提供了可能存在的問題的一些指示。 在此,訊息是 \codequote{\textcolor{red}{UndefVarError: prinln not defined}}。 當然這也是很容易修復的,所以現在代碼變成了 |
| 75 | + |
| 76 | +\codequote{mystiring1 = "Hello, world";}\\ |
| 77 | +\codequote{println(mystring1)} |
| 78 | + |
| 79 | +現在我們看到一個錯誤:訊息是 \codequote{\textcolor{red}{UndefVarError: mystring1 not defined}}。多麼出乎意料!這似乎是錯誤的:該行是有效的 Jullia 代碼!當我們檢查 \codequote{println()} 行時,變數名稱似乎沒有問題,它怎麼可能是未定義的??這在除錯中經常發生:一些錯誤掩蓋了其他錯誤。你修復了你找到的第一個錯誤,最終它們會揭示在你的代碼中更早地錯誤。當然,這裡在它上面的行中有一個拼寫錯誤。如果我們沒有立即發現,錯誤訊息說 \codequote{\textcolor{red}{mystring1 not defined}} 的事實應該會有所幫助。 這意味著這是 Julia 第一次看到名稱 \codequote{mystring1}。 我們認為稍早已創建它是錯誤的:要嘛根本沒有創建它的行,要嘛這行是錯誤的。 找到應該創建它的行,並修復錯誤。 最終,我們最後一次正確的更改為 |
| 80 | + |
| 81 | +\codequote{mystring1 = "Hello, world";}\\ |
| 82 | +\codequote{println(mystring1)} |
| 83 | + |
| 84 | +\section*{關於除錯的一些要點} |
| 85 | + |
| 86 | +以這種方式逐行檢查絕不是發現錯誤的唯一方法,但它是開始學習如何除錯代碼的好地方。 你應該經常練習並能熟練地解讀錯誤訊息。 |
| 87 | + |
| 88 | +事實上,除錯對於程式設計師來說絕對是一項至關重要的技能。 就像編寫代碼一樣,這裡有很多很多風格的除錯方式\footnote{我們將在下一課中看到,編寫代碼從根本上是一種創造性表達的行為。 除錯也允許你按照自己的方式進行。}。但它們的核心是能夠以非常挑剔的眼光閱讀代碼。那個能力是你應該培養的。 |
| 89 | + |
| 90 | +如果你繼續進行大量編程,你可能希望了解可以幫助你完成任務的軟體。那裡有很多選擇\footnote{對於 Julia,主要支持的是 \codequote{Debugger.jl} 套件包,它非常有用但需要一段時間來學習,以及 \codequote{Juno} 開發介面,它雖不是專門用於除錯,但有很多功能可以有所幫助—這些功能可以通過使用 \codequote{Debugger.jl} 進行擴展。 },但在本課程中我們不會討論到。 |
| 91 | + |
| 92 | +\section*{回顧與總結} |
| 93 | + |
| 94 | +\begin{description} |
| 95 | + \item[*] 逐行除錯是一項非常有用的技能學習。 |
| 96 | + \item[*] Julia 中的錯誤訊息包含有用的提示及許多其他細節。 |
| 97 | + \item[*] Julia\footnote{或任何其他語言,就此而言。} 中的錯誤訊息不能保證它們指向實際錯誤。 |
| 98 | + \item[*] 在 REPL 和運行具有相同代碼的 .jl 檔案的逐行輸出並不完全相同。 |
| 99 | + \item[*] 對於逐行輸出,在行尾使用分號來抑制輸出是很有幫助的。 |
| 100 | + \end{description} |
| 101 | +\end{document} |
0 commit comments