[英]angularjs capture html element and data that triggered an $exceptionHandler error?
我的應用程序有一個有效的$exceptionHandler
,如果發生 angularJS 錯誤,它會捕獲錯誤並將數據通過電子郵件發送給我。 但它沒有捕獲觸發 $scope 函數的 HTML 元素,也沒有捕獲傳遞給導致錯誤觸發的函數的數據。
詳細地說,我的應用程序中有多個頁面使用相同的控制器,而這些控制器又使用相同的功能。 例如,在用戶輸入數據的多個頁面上使用相同的驗證monitorLength
函數,在某些情況下,它在<input type='tel' ng-keydown="monitorLength($event,this.id,phoneLength,1)">
字段,在其他情況下在<input type='number' ng-keydown="monitorLength($event,this.id,postalLength,2)">
字段上,在某些情況下該函數被另一個調用功能。
但是當錯誤/異常被拋出時,它告訴我的只是類似於下面的內容,這使得幾乎不可能確定函數在哪個頁面/模板/輸入字段上使用或導致函數出錯的數據是什么:
Exception: undefined is not an object (evaluating 'mLengths.length')
Stack: ionic://localhost/js/controllers.js:1291:47
在錯誤處理中,我怎樣才能獲得 A) 調用函數的 HTML 輸入/按鈕/字段和 B) 獲得傳遞給導致錯誤的函數的數據?
使用提到的示例,這里是 monitorLength 函數:
var permitChars = [8,35,36,46] ; //allow delete and backspace
var permitZip = [32,109,189] ; //allow characters in zip code
$scope.monitorLength = function($event,item,itemID,mLengths,deny) {
//deny = 1 = phone
// 2 = zip
var keyCode = $event.keyCode || $event.charCode ;
if (!permitChars.includes(keyCode)) {
if (deny == 1 && isNaN(String.fromCharCode(keyCode))) {
$scope.errMsg = "Non-numeric characters are not permitted. IE: + . , - etc" ;
$scope.errColor = "red" ;
$event.preventDefault() ;
return ;
}
if (deny == 2 && (isNaN(String.fromCharCode(keyCode)) || permitZip.includes(keyCode))) {
$scope.errMsg = "Only numbers, space and dash/minus characters are permitted" ;
$scope.errColor = "red" ;
$event.preventDefault() ;
return ;
}
var len = $scope[item][itemID] ;
if (deny == 1 && (/^0/.test(len) || /^1/.test(len))) {
$scope.errMsg = "Country/Prefix code already selected, just enter main phone number" ;
$scope.errColor = "red" ;
$event.preventDefault() ;
return ;
}
var maxLength = parseInt(mLengths[mLengths.length-1]) ;
if (len && (len.toString().length > maxLength)) {
$scope.errMsg = "Max length is " +maxLength+ " chars for this field"
$scope.errColor = "red" ;
$event.preventDefault() ;
return ;
}
} else {
$scope.errMsg = "" ;
}
}
這是我的錯誤/異常處理程序:
.config(function ($provide,apiServiceProvider) {
$provide.decorator('$exceptionHandler', function($delegate) {
return function (exception, cause) {
// return emailApi(eType,cat,topic,subject,msg) ;
var msg = "\nDateTime: " + new Date() ;
msg = msg+ "\nAppVersion: " +appFullVer ;
msg = msg + "\nException: " +exception.message ;
msg = msg + "\n<br>Stack: " +exception.stack ;
if (cause) {
msg = msg + "\n<br>Cause: " +cause ;
} else {
msg = msg + "\n<br>Cause: none passed" ;
}
if (httpErrorID == 1) {
msg = msg+ "\nHTTP Error: " +httpErrorMsg ;
httpErrorID = 0 ;
}
if (errTesting == 0) {
apiServiceProvider.$get().mail(5,"AppError","Bug","App Angular JS Error",msg) ;
} else {
console.log(msg) ;
}
}
}) ;
})
mLengths
是否曾經undefined
等?
為mLengths
設置一個值mLengths
改變什么嗎?
$scope.mLengths = mLengths || [];
另外,像這樣重構
const index = mLengths.length - 1;
parseInt(mLengths[index])
在調試中可能很有用。
我不希望我的代碼能夠工作,只是為了表達想法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.