經常有用戶發個系統貼圖給我,通常是系統出現了一個提示,但是很多情況下我們根本沒辦法知道這個提示是源自哪一個方法,在代碼的哪一行,經常找半天才能找到提示的位置.如果是系統級的錯誤,我知道在錯誤物件中可以找到答案,但是普通的提示,卻無從得知代碼運行的行號及所處的位置,請問有辦法得到這些資訊么,多謝.
uj5u.com熱心網友回復:
如果是xxxx.exe非法操作,記憶體XXXXXXXX為只讀,是否向微軟報告錯誤什么什么的那些.基本上你就沒機會了,PB自己都飛出去了.但很多時候,是因為記憶體越界,留意外部函式呼叫前,是否有申請足夠的記憶體.
如果實在找不到,只能一行行寫日志檔案測驗,看記到哪一行就出錯。
uj5u.com熱心網友回復:
不是你說的這個意思啦,這些提示,通常是我們代碼里寫的,如比在保存的時候,提示"XXX數量不能大過XXX數量",然后不能讓用戶保存了,這時候用戶就會發過來給我們,問是怎么回事,這個時候我們可能就要幫去查這個提示是從什么位置報出來的,是資料錯誤還是程式錯誤.我現在就是想快速的得知出這個提示所在的方法及行號.可以很快的從原始碼中找到這個問題.uj5u.com熱心網友回復:
這樣的話估計就要自己撰寫一個錯誤提示字典,每個提示框中標題顯示錯誤提示ID,然后去找對應的代碼位置。uj5u.com熱心網友回復:
直接得到方法和行號是不可能的,起碼我還沒想到。一般做法用全域變數保存當前物件名:視窗,資料視窗物件,所在PBL等。如果需要,由特定的快捷鍵觸發。就你的目的來看,最簡單的方法是右鍵點擊application,search你需要定位的提示資訊即可,不過要PB8.0及以上。uj5u.com熱心網友回復:
基本可以實作lz的需求:string ls_script
RunTimeError e
try
if true then//自己判斷什么地方問題,比如用戶輸入的資料錯誤
throw e
end if
catch(RunTimeError lrte)
ls_script = "OBJECT: " + lrte.ObjectName + "." + lrte.Class + "~n" +&
"SCRIPT: " + lrte.RoutineName+"~n"+&
"line:"+string(lrte.Line) +"~n"+&
"Number:"+ string(lrte.Number )
messagebox('error',ls_script)
finally
messagebox('','fff')
end try
結果:
OBJECT: w_main.cb_10
SCRIPT: clicked
line:7
Number:2
uj5u.com熱心網友回復:
這種方式太麻煩了,莫非我得將每個代碼的位置都要改一遍?有沒有不需要改動原代碼便可簡單獲取的辦法嗎?
uj5u.com熱心網友回復:
不改動代碼是不可能的,可以把5樓的代碼寫成一個函式,每次錯誤提示的時候調一下就OK了uj5u.com熱心網友回復:
問題就是你先寫好了所有的程式,然后再考慮架構的設計,必然會麻煩。如果你的繼承關系很好的話,改起來也許不太麻煩。uj5u.com熱心網友回復:
這樣可以看出良好的設計的重要性了uj5u.com熱心網友回復:
如果圖簡單的話
把全部代碼匯出去成為*.SR*.//這是一個文本檔案
另寫一個程式,查找所有的MESSAGEBOX,第一個引數(標題)加一個唯一的序列號,修改完后重新匯入.
比如原來是messagebox('資訊','因為......不能保存')
改為messagebox('資訊'+"##23",'因為......不能保存')
這個作業花不了您半天時間.
uj5u.com熱心網友回復:
不需要那么復雜吧,PB有物件error,這個物件有多種屬性足夠你使用了,直接在APPLICATION的sysError事件中捕捉,一個地方書寫就可以了。
uj5u.com熱心網友回復:
看pfcuj5u.com熱心網友回復:
一般是在應用物件的syserror事件里面記錄錯誤日志uj5u.com熱心網友回復:
你就一點一點改吧.你自己提示的東西,你應該知道是出了什么問題啊.
uj5u.com熱心網友回復:
永生哥威武uj5u.com熱心網友回復:
同意11樓,在應用的sysError事件捕獲Error物件的相關屬性就行了.error.number
error.windowmenu
error.object
error.objectevent
error.line
uj5u.com熱心網友回復:
找自己寫的錯誤提示,最簡單的方法樓上都說了,右鍵點擊application,search提示資訊。PB8.0以上。如果程式不是8.0以上的寫的,那裝一個8.0或9.0。建個workspace->application,把所有的pbl加入library list,一樣可以search。偶以前用6.5的時候常這么搞,吼吼uj5u.com熱心網友回復:
TryCatch
uj5u.com熱心網友回復:
學習中uj5u.com熱心網友回復:
11樓是對的。。。。最好用自帶的。。。uj5u.com熱心網友回復:
樓上幾個頂11樓的貌似沒有看明白樓主的問題,,人家說的不是系統錯誤,不會觸發SYSERRor那個事件!倒是10樓的方法比較簡單實用。
uj5u.com熱心網友回復:
可以用populateerror()功 能:以應用程式定制的錯誤號和錯誤資訊填充Error物件,該函式不觸發應用物件的SystemError事件。
語 法:PopulateError ( number, text )
參 數:number:integer型別,指定要保存到Error物件number屬性中的值;
text:string型別,指定要保存到Error物件text屬性中的值。
回傳值:Integer。函式執行成功時回傳1,發生錯誤時回傳-1。
用 法:當應用程式需要根據變數的當前取值來定制Error物件時,可以使用PopulateError()函式來填充Error物件的number和text屬性,同時該函式根據背景關系自動填充Error物件的其它屬性。
定制了Error物件后,應用程式可以使用不帶引數的SignalError()函式觸發應用物件的SystemError事件。這樣,在SystemError事件的事件處理程式中可以撰寫處理定制錯誤和系統錯誤的通用代碼。如果應用程式沒有對SystemError事件撰寫事件處理程式,那么SignalError()函式什么也不做。
這樣可以通過SystemError事件獲取想要的詳細資訊,也可以對提示錯誤資訊進行修改,固定錯誤代碼,結合樓上說的可以在匯出文本中對此代碼進行唯一標示,再在SystemError事件中進行處理。不知這樣可行否。
uj5u.com熱心網友回復:
PB 發布時選中Error Context information即可uj5u.com熱心網友回復:
可以用系統自帶的Error來處理出錯代碼:error.number
出錯英文資訊:Error.text
出錯視窗/選單/物件:Error.windowmenu
出錯物件/控制元件:Error.object
出錯腳本:Error.objectevent
出錯行號:Error.line
以上資訊可以寫在彈出視窗中,然后再Application中的SystemError事件中呼叫該視窗即可。
uj5u.com熱心網友回復:
暈,看錯發貼時間了還是給后來人一個參考吧,答案肯定正確,呵呵
uj5u.com熱心網友回復:
樓上的,不管怎么樣還是支持你!uj5u.com熱心網友回復:
樓上的,都沒得分啊。我學習過了uj5u.com熱心網友回復:
Mark一下 頂起~~轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/62198.html
標籤:腳本語言
上一篇:PB 生成二維碼
