警告處理(Handling Warnings)

警告(warnings)與錯誤類似,都是用來通知使用者有一些預期之外的情況發生,但不同的是警告不會中斷目前所執行的程式。例如在數值除以零的的情況,Octave 會產生一個警告並將結果設為無限大(Inf):

a = 1/0

輸出為

warning: division by zero
a = Inf

產生警告(Issuing Warnings)

警告(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.

由於警告對於程式的執行是沒有直接影響的,所以其沒有類似錯誤 trycatch 敘述的處理方式,只能使用 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

啟用與關閉警告(Enabling and Disabling Warnings)

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)
  # ...

然而將指定算子放在 whileif 敘述中也是一種常見的寫法,由其在 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 不是一個常數或常數算式,就會提出警告,此警告預設為關閉。