聲明:
此文撰寫的目的在於探討Domino開發技術,並儘量迴避開發過程中有可能犯下的錯誤,請勿將其用於不適當的場合,否則後果自負!
前兩天碰到一個奇怪的問題,某段代碼一執行,就會立即觸發NSD錯誤。如果代碼運行在客戶端,則客戶端會被強制關閉。如果代碼運行在服務器,則整個Domino服務器會立即癱瘓並被強制關閉。當時通過Lotusscript調試,發現在如下函數退出時程序崩潰:
Function getVariant() as Variant
dim vrnTemp as Variant
...
End Function
dim vrnTemp as Variant
...
End Function
琢磨了半天,恍然大悟,忘了寫返回值(-_-)b
更改後代碼如下:
Function getVariant() as Variant
dim vrnTemp as Variant
...
getVariant = vrnTemp ' 給函數賦返回值。這句是原來忘了寫的。
End Function
dim vrnTemp as Variant
...
getVariant = vrnTemp ' 給函數賦返回值。這句是原來忘了寫的。
End Function
這樣一來問題就消失了,我也一度認爲Variant型的函數必須賦返值,可是今天想再研究一下這問題時,卻發現問題無法重現了。莫非是原來的推斷有誤?更深入的研究證實了這一點。原來,問題的產生的源頭是另一個函數。
Function wrongFunction() as Variant
...
'vrnSource is a string array
vrnSource = arrayappend(vrnSource, getVariant()) '其實是一執行到這裏就NSD
...
End Function
...
'vrnSource is a string array
vrnSource = arrayappend(vrnSource, getVariant()) '其實是一執行到這裏就NSD
...
End Function
實測結果表明,當使用ArrayAppend()方法時,如果第二個參數是Nothing,則會立即觸發NSD錯誤。按照這個思路,完全可以寫出類似以下的代碼。
Dim v As Variant
v = Split("", "")
v = Arrayappend(v, Nothing)
v = Split("", "")
v = Arrayappend(v, Nothing)
當代碼執行時,便會觸發NSD錯誤。如果類似有問題的代碼放置服務器上,又設置爲定時代理……後果不堪設想。
PS:經測試,如果將第二個參數Nothing換爲Null或者Empty,則不會出現類似的問題。