警告(warnings)與錯誤類似,都是用來通知使用者有一些預期之外的情況發生,但不同的是警告不會中斷目前所執行的程式。例如在數值除以零的的情況,Octave 會產生一個警告並將結果設為無限大(Inf
):
a = 1/0
輸出為
warning: division by zero a = Inf
警告(warnings)可以使用 warning()
函數來產生,最簡單的方式就是輸入一個描述警告的字串參數,例如下面的程式碼會在變數 a
的值為負的情況下產生警告,並將 a
設為 0
:
a = -1; if (a < 0) warning ("'a' must be non-negative. Setting 'a' to zero."); a = 0; endif
執行的輸出為
warning: 'a' must be non-negative. Setting 'a' to zero.
由於警告對於程式的執行是沒有直接影響的,所以其沒有類似錯誤 try
與 catch
敘述的處理方式,只能使用 lastwarn()
函數取得最後一次的警告資訊。
warning()
函數亦可使用警告代碼來指定所要產生的警告,或是將指定的警告啟動或關閉。
warning (template, ...) warning (id, template, ...) warning ("on", id) warning ("off", id) warning ("error", id) warning ("query", id)
warning(template, ...)
函數會依照 template
所指定的格式將錯誤訊息輸出至標準錯誤(stderr),其格式的指定方式與 printf()
函數相同,而在輸出時會自動在每一行的開頭加上 "warning: "
。這個函數用於告知使用者有不正常的狀況發生,但是程式還是會繼續執行下去。
其中 id
參數是警告代碼,使用者可以使用此代碼來啟動或關閉指定的警告,若指定為 "all"
則表示全部的警告。
warning("query", id)
可以查詢 id
所指定的警告的狀態,若省略 id
參數則預設為 "all"
(即所有的警告)。warning("query", id)
是將 id
所指定的警告狀態設定為錯誤,這樣會使這個警告被當作一個錯誤來處理。
[msg, msgid] = lastwarn (msg, msgid)
lastwarn()
函數若不輸入任何參數則會傳回最後一次的警告訊息,若指定 msg
參數則會將最後一次的警告訊息設定為 msg
,若再加上 msgid
參數則會一並將最後一次的警告代碼設定為 msgid
。
warning()
函數可以控制哪一些警告要輸出至螢幕上,若呼叫此函數只有傳入一個 "on"
或 "off"
參數,則會啟動或關閉所有的警告。若要控制指定的警告,可以使用警告的代碼,例如下面這個程式碼會產生警告:
warning ("non-negative-variable", "'a' must be non-negative. Setting 'a' to zero.");
而下面這個則會將警告關閉:
warning ("off", "non-negative-variable"); warning ("non-negative-variable", "'a' must be non-negative. Setting 'a' to zero.");
下面是 Octave 中內建函數所使用的警告:
Octave:array-to-scalar
Octave:array-to-scalar
警告,則當陣列要被自動轉換成純量時,就會產生警告,此警告預設為關閉。Octave:array-to-vector
Octave:array-to-vector
警告,則當陣列要被自動轉換成向量時,就會產生警告,此警告預設為關閉。Octave:assign-as-truth-value
Octave:assign-as-truth-value
警告,則 Octave 碰到下面這樣的程式碼就會產生警告:
if (s = t) # ...
因為這樣的程式碼通常是因為少寫了一個等於符號,應該是要寫成這樣才合理:
if (s == t) # ...
然而將指定算子放在 while
或 if
敘述中也是一種常見的寫法,由其在 C 語言中,例如:
while (c = getc()) # ...
在這種情況下若開啟 Octave:assign-as-truth-value
警告,Octave 也會產生警告訊息,但將此警告關閉又會容易忽略掉漏寫等號的問題,要處理這樣的情況可以將有使用指定運算子的地方再加入一個額外的小括號,這樣就可以避免產生警告訊息,例如上面的例子就可以寫成這樣:
while ((c = getc())) # ...
這樣即可避免產生警告訊息,亦可以讓 Octave 檢查其他地方是否有漏寫等號。
Octave:assign-as-truth-value
警告預設是開啟的。
Octave:associativity-change
Octave:associativity-change
警告,當運算子的關聯性改變會對程式的解讀造成影響時,Octave 就會提出警告,運算子關聯性改變一般都是為了與 Matlab 相容,預設 Octave:associativity-change
警告式開啟的。Octave:divide-by-zero
Octave:divide-by-zero
警告,則當 Octave 遇到一個數值除以零的時候就會產生警告,預設為開啟。Octave:empty-list-elements
Octave:empty-list-elements
警告,當使用中括號建立矩陣時,若中括號中有包含空矩陣,則會提出警告,例如:
a = [1, [], 3, [], 5]
Octave:empty-list-elements
警告預設是開啟的。
Octave:fortran-indexing
Octave:fortran-indexing
警告,則在使用單一個索引存取二維的矩陣時,就會提出警告,此警告預設為關閉。Octave:function-name-clash
Octave:function-name-clash
警告,當 Octave 發現一個定義在函數檔案中的函數,其函數名稱與檔案名稱不同時(若函數名稱與檔案名稱不同,則此函數會被忽略),就會提出警告,此警告預設為開啟。Octave:future-time-stamp
Octave:future-time-stamp
警告,當 Octave 發現有函數檔案的時間戳記是未來的時間時,就會提出警告,此警告預設為開啟。Octave:imag-to-real
Octave:imag-to-real
警告,則當一個複數自動轉換為實數時就會提出警告,此警告預設為關閉。Octave:matlab-incompatible
Octave:matlab-incompatible
警告,則當有可能會出現 Matlab 相容性問題時,就會提出警告。Octave:missing-semicolon
Octave:missing-semicolon
警告,當函數中的敘述沒有以分號結尾時,就會提出警告,此警告預設為關閉。Octave:neg-dim-as-zero
Octave:neg-dim-as-zero
警告,當遇到維度為負的時候,就會提出警告,例如:
eye (-1)
Octave:neg-dim-as-zero
警告預設為關閉。
Octave:num-to-str
Octave:num-to-str
警告,當數值自動轉換成對應的 ASCII 字元時,就會提出警告,此警告預設為開啟。Octave:precedence-change
Octave:precedence-change
警告,當優先權的改變會對於程式的解讀造成影響時,Octave 就會提出警告,優先權的改變一般都是為了與 Matlab 相容,此警告預設為開啟。Octave:reload-forces-clear
Octave:reload-forces-clear
警告,則當要清除這些以載入的函數時,就會提出警告,並列出所有會被清除的函數,此警告預設為開啟。Octave:resize-on-range-error
Octave:resize-on-range-error
警告,當矩陣變換其大小時,若定的大小不在目前的範圍內,則會提出警告,此警告預設為關閉。Octave:separator-insert
Octave:separator-insert
警告,則當字元矩陣中會被自動安插逗號或是分號時,就會提出警告。Octave:single-quote-string
Octave:single-quote-string
警告,則當單引號字串用於常數字串時,就會提出警告。Octave:str-to-num
Octave:str-to-num
警告,則當字串自動依照 ASCII 轉換為數值時,就會提出警告,例如:
"abc" + 0
Octave:str-to-num
警告預設為關閉。
Octave:string-concat
Octave:string-concat
警告,若混合單引號與雙引號的字串使用時,就會提出警告,此警告預設為關閉。Octave:undefined-return-values
Octave:undefined-return-values
警告,若在函數中沒有定義所有呼叫時所指定的傳回值,就會提出警告,此警告預設為開啟。Octave:variable-switch-label
Octave:variable-switch-label
警告,若在 switch
的敘述中 label
不是一個常數或常數算式,就會提出警告,此警告預設為關閉。Page: 1 2