2013-03-20 74 views
0

我試圖爲我的xpages生成一個自定義錯誤頁面。我搜索了很多解決方案,到目前爲止,我收到一個錯誤頁面告訴我,發生錯誤。XPages自定義錯誤頁面 - 獲取錯誤消息和行

但我無法得到信息究竟發生了什麼(在這種情況下,錯誤是,「文檔」必須保存,但我命名變量「文檔」只是爲了得到錯誤)。

所有我做的是:

var errObj = requestScope.error; 
output = errObj.getCause().getErrorPropertyId(); 
output = errObj.getCause().getComponentId(); 

只要我打電話getExpressionText()我得到一個錯誤500

我如何獲得的信息,在發生錯誤(行號)和導致錯誤的變量? - 就像我使用標準錯誤頁面一樣。

回答

1

錯誤行和細節並不方便來自requestScope.error。如果您查看Mark Leusink調試工具欄最新版本的源代碼,您會看到他正在解析堆棧跟蹤以獲取詳細信息。

但是,您可以使用底層Java類爲SSJS異常訪問所有相關信息 - com.ibm.jscript.InterpretException使用getErrorLine()。 getLocalizedMessage()方法獲取通常開始「腳本解釋器錯誤」的錯誤細節。 getExpressionText()方法檢索拋出錯誤的行。

如果您看看我放在OpenNTF上的XPages OpenLog Logger項目,那就是我用來記錄OpenLog的全部細節。 http://www.openntf.org/Internal/home.nsf/project.xsp?action=openDocument&name=XPages%20OpenLog%20Logger

你可以看到它在這裏使用這些方法OpenLogPhaseListener的源代碼:https://github.com/paulswithers/openlogjava/blob/master/OpenLogJava/WebContent/WEB-INF/src/com/paulwithers/openLog/OpenLogPhaseListener.java

即使你不是一個Java專家,從使用SSJS的關鍵部位應可以理解的。第84行捕獲未捕獲的異常 - 當XPages路由到默認錯誤頁面時。這使用我提到的方法。

線98到105是記錄了所有的細節,如果你只使用一個catch塊,路過OpenLogBean.addError(e, this)其中e是錯誤對象和this是發生在錯誤的組件的人。 Java代碼中的error.getError()將檢索該錯誤對象。爲了獲得SSJS中的預測,您需要使用catch(e:com.ibm.jscript.InterpretException)我相信。

我還沒有測試過這個,我剛從我在OpenNTF上的項目中使用過。

+0

好的,謝謝!我會試一試,但這似乎是正確的方式,因爲調試工具欄日誌記錄似乎工作相似。 – 2013-03-28 07:44:47

1

看一下Tony McGuckin的這個XSnpet:http://openntf.org/XSnippets.nsf/snippet.xsp?id=custom-error-page-cw-cause-and-stacktrace-information。它使用上的錯誤以下輸出細節:

var output = requestScope.error.toString()+"\n\n"; 
    if(requestScope.error instanceof com.ibm.xsp.exception.XSPExceptionInfo){ 
    var codeSnippet = requestScope.error.getErrorText(); 
    var control = requestScope.error.getErrorComponentId(); 
    var cause = requestScope.error.getCause(); 
    output += "In the control : " + control + "\n\n"; 
    if(cause instanceof com.ibm.jscript.InterpretException){ 
     var errorLine = cause.getErrorLine(); 
     var errorColumn = cause.getErrorCol(); 
     output += "At line " + errorLine; 
     output += ", column " + errorColumn + " of:\n"; 
    }else{ 
     output += "In the script:\n"; 
    } 
    output += codeSnippet; 
    } 
    return output; 
+0

謝謝,這已經是我正在使用的代碼。但是,在我的自定義錯誤頁面中使用此代碼時,出現以下錯誤消息:「Fehler beimAusführeneines JavaScript-Aktionsausdrucks。」所以沒有關於代碼行的信息或者發生了什麼。但是使用XPage Standard錯誤頁面,我得到了更多的信息:「Script-Interpreterfehler,Zeile = 5,Spalte = 9:[ReferenceError]'docs'nicht gefunden」,甚至顯示代碼行 – 2013-03-20 14:54:47

0

現在我已經通過Debug ToolbarOpenLog Database處理這個問題。

如果發生錯誤,用戶只能得到一個自定義的錯誤頁面(使用調試工具欄的例子)和信息,出錯了。所以他不必擔心任何其他問題甚至堆棧跟蹤。但在同一時刻,他得到錯誤頁面,錯誤記錄在我們的日誌數據庫中,包含所有需要的信息(如行,確切的錯誤信息等)。

我還實施了「將此問題報告」鏈接,按鈕來創建包含關於用戶當前會話重要信息的新電子郵件。