簡體   English   中英

angularjs 捕獲觸發 $exceptionHandler 錯誤的 html 元素和數據?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM