2020年6月30日 星期二

錯誤類別簡介

寫程式要不發生錯誤是絕無可能。錯誤分成三大類:語法錯誤,執行時期錯誤(又稱作例外)以及邏輯錯誤。一般的程式開發環境在發生語法錯誤的時候即可偵測出來,並提醒開發者修正。如果沒有修正逕自執行,會返回SyntaxError訊息。至於執行時期錯誤,指的是在執行到一半才會出錯,此時會返回Exception,這一類的錯誤可以用例外處理機制來解決。底下用一個簡單的例子來做說明。

(圖一) for迴圈最後少了冒號

圖一的程式碼是要計算x當中所有數字的總和。在第10行for迴圈的最後少了冒號,這違反了Python的語法規則,因此編輯器在行數10之前顯示了叉叉符號,提醒開發者語法錯誤。如果不修正直接執行,則會出現如圖二的語法錯誤訊息:

(圖二) SyntaxError訊息

在第十行for迴圈之後補上了冒號之後(如圖三),叉叉符號消失,代表沒有語法錯誤。此時再次執行程式,另一個錯誤出現(圖四):

(圖三) 修正語法錯誤之後的程式碼

(圖四) TypeError

這個錯誤是因為x當中混入了字串'John',而字串是無法與數字相加的。由於這是無法預期的錯誤,所以又稱作例外,我們可以用例外處理機制來解決,程式碼修改如下:

(圖五) 加入try-except機制
(圖六) 最後輸出結果

try段指的是如果可以相加便相加,不然便跳到except段去處理。這裡的except直接不處理(pass)。因此迴圈在輪到'John'的時候就什麼都不做,直接輪到下一個值,直到迴圈完成為止。因為例外已經被處理過了(pass也是一種處理),因此不會返回任何錯誤訊息,如圖六。

邏輯錯誤指的是代碼可以完成執行而不會返回錯誤訊息,然而執行結果卻不符合預期。圖七的程式碼目的是求取奇數項的和,即1+3+5+7,總和應為16。然而計算結果卻是12。原因是Python的引數是從0開始,所以程式碼必須改成sum(x[0::2])(如圖八),才能得到預期的結果16。邏輯錯誤一般來說要遠比語法錯誤及執行時期錯誤錯誤難處理的多。

(圖七)

(圖八)



如何取出具有相同性質的多個物件名稱

一個HFSS設計通常包含多個幾何模塊,這些模塊不僅拓樸結構不一樣。材料也不盡相同。如圖一。假設程式設計需要挑選出具有相同性質的模塊來編輯,程式碼該如何編寫?

(圖一) 不同拓樸結構與材料的模塊

這裡的性質可以是拓撲結構(點、線、面、三維),位置(高度),材料,顏色,尺寸,群組等等。舉例來說,具備同樣拓撲結構的物件名稱可以透過內建的函式GetObjectsInGroup()得到:

solids = oEditor.GetObjectsInGroup('solids')
AddWarningMessage(str(solids))
sheets = oEditor.GetObjectsInGroup('sheets')
AddWarningMessage(str(sheets))
lines = oEditor.GetObjectsInGroup('lines')
AddWarningMessage(str(lines)) 

(圖二) 輸出之3D結構,平面及線的物件名稱
或屬於同一類的材料:

coppers = oEditor.GetObjectsInGroup('copper')
AddWarningMessage(str(coppers))
tins = oEditor.GetObjectsInGroup('tin')
AddWarningMessage(str(tins))

(圖三) 對應到不同材料的物件名稱

如果用滑鼠依序點選了多個物件,如圖四,接下來想啟動程式來對這些選中的物件做運算,可以用函數GetSelections()取得這些物件的名稱。list當中物件名稱的排列順序與滑鼠點選順序相同,如圖五。

sels = oEditor.GetSelections()
AddWarningMessage(str(sels))

(圖四) 點選物件順序

(圖五) 輸出順序與點選順序相同