国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

js捕獲錯(cuò)誤信息

yuanzhanghu / 1020人閱讀

摘要:捕獲分為兩個(gè)方面收集語法執(zhí)行錯(cuò)誤最初的是想直接獲取控制臺(tái)的錯(cuò)誤信息然而這并不大可行,并沒有這樣的功能。

這個(gè)不是很常用的功能, 但是想收集客戶端的錯(cuò)誤信息時(shí)卻很有必要了解下。 捕獲分為兩個(gè)方面:
收集JS語法、執(zhí)行錯(cuò)誤

最初的是想直接獲取控制臺(tái)的錯(cuò)誤信息; 然而這并不大可行,JS并沒有這樣的功能。

轉(zhuǎn)換下思路

在錯(cuò)誤發(fā)生時(shí),將錯(cuò)誤進(jìn)行存儲(chǔ)。

原生JS實(shí)現(xiàn)方式:

通過重載 window 對(duì)象下的 onerror 函數(shù), 可以截取到這些信息。

window.onerror = function(errorMessage, scriptURI, lineNumber,columnNumber,errorObj) {
   console.log("錯(cuò)誤信息:" , errorMessage);
   console.log("出錯(cuò)文件:" , scriptURI);
   console.log("出錯(cuò)行號(hào):" , lineNumber);
   console.log("出錯(cuò)列號(hào):" , columnNumber);
   console.log("錯(cuò)誤詳情:" , errorObj);
}
框架實(shí)現(xiàn)方式:
只在angular 下做了實(shí)現(xiàn),沒有實(shí)現(xiàn)過的框架沒有發(fā)言權(quán);接下來將以angular為例。但要注意的是在部分框下這種方式是不生效的,原因是在框架解析代碼前,所有的代碼可以理解為都是文本而非js文件。

angular 環(huán)境下無法使用window.ondrror. 原因是angular體制內(nèi)的代碼通過$even 解析后并不會(huì)將錯(cuò)誤移交給 window.onerror 函數(shù)

但是 angular 在解析時(shí)會(huì)將所有的語法、執(zhí)行錯(cuò)誤時(shí)將會(huì)觸發(fā) $ExceptionHandlerProvider 函數(shù):

function $ExceptionHandlerProvider() {
  this.$get = ["$log", function($log) {
    return function(exception, cause) {
      $log.error.apply($log, arguments);
    };
  }];
}

$ExceptionHandlerProvider 函數(shù)將會(huì)調(diào)用 consoleLog("error") 函數(shù)

this.$get = ["$window", function($window) {
return {
  /**
   * @ngdoc method
   * @name $log#log
   *
   * @description
   * Write a log message
   */
  log: consoleLog("log"),
  /**
   * @ngdoc method
   * @name $log#info
   *
   * @description
   * Write an information message
   */
  info: consoleLog("info"),
  /**
   * @ngdoc method
   * @name $log#warn
   *
   * @description
   * Write a warning message
   */
  warn: consoleLog("warn"),
  /**
   * @ngdoc method
   * @name $log#error
   *
   * @description
   * Write an error message
   */
  error: consoleLog("error"),
  /**
   * @ngdoc method
   * @name $log#debug
   *
   * @description
   * Write a debug message
   */
  debug: (function() {
    var fn = consoleLog("debug");
    return function() {
      if (debug) {
        fn.apply(self, arguments);
      }
    };
  }())
};
function consoleLog(type) {
  var console = $window.console || {},
      logFn = console[type] || console.log || noop,
      hasApply = false;
  // Note: reading logFn.apply throws an error in IE11 in IE8 document mode.
  // The reason behind this is that console.log has type "object" in IE8...
  try {
    hasApply = !!logFn.apply;
  } catch (e) {}
  if (hasApply) {
    return function() {
      var args = [];
      forEach(arguments, function(arg) {
        args.push(formatError(arg));
      });
      return logFn.apply(console, args);
    };
  }
  // we are IE which either doesn"t have window.console => this is noop and we do nothing,
  // or we are IE where console.log doesn"t have apply so we log at least first 2 args
  return function(arg1, arg2) {
    logFn(arg1, arg2 == null ? "" : arg2);
  };
}

最終這些錯(cuò)誤會(huì)流入原生console.error內(nèi), 所以在angular下捕獲這些錯(cuò)誤將變的異常簡(jiǎn)單。僅僅需要重置console.error方法,如下所示:

resetConsole() {
    window.console._error = window.console.error;
    window.console.error = info => {
        // 在這里執(zhí)行錯(cuò)誤存儲(chǔ)或發(fā)送
        window.console._error(info);
    };
}

angular 在解析錯(cuò)誤時(shí), 會(huì)通過$log.error.apply $window.console.error方法. 所以在這里將 console.error 進(jìn)行重置后, 語法、執(zhí)行錯(cuò)誤也會(huì)一并收集到。

收集請(qǐng)求錯(cuò)誤

各框架都會(huì)將 XMLHttpRequest 進(jìn)行封裝, 可以找到對(duì)應(yīng)的errror函數(shù)內(nèi)將錯(cuò)誤進(jìn)行捕獲。

原生實(shí)現(xiàn)收集請(qǐng)求錯(cuò)前, 需要先對(duì)XMLHttpRequest進(jìn)行封裝,示例如下:

var ajax = function(type, url, callback){
    var xhr = new XMLHttpRequest();
    xhr.open(type, url);
    xhr.onreadystatechange = function() {
        if (xhr.readyState !== 4) {
            return;
        }
        if (xhr.status >= 200 && xhr.status < 300 || xhr.status === 304) {
            callback();
        } else {
            console.log("收集到一條錯(cuò)誤");// 在這里收集錯(cuò)誤信息
        }
    };
    xhr.send(null);
}
// 因?yàn)?ccccccom這個(gè)路徑是不存在的, 所以會(huì)執(zhí)行收集區(qū)域的代碼。
ajax("GET", "http://www.lovejavascript.ccccccom", function(a){console.log(a)});

如果對(duì) XMLHttpRequest 封裝感興趣, 可以看下我寫的 jTool類庫中的 ajax 對(duì)象

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/109715.html

相關(guān)文章

  • JS錯(cuò)誤監(jiān)控總結(jié)

    摘要:前言做好錯(cuò)誤監(jiān)控,將用戶使用時(shí)的錯(cuò)誤日志上報(bào),可以幫助我們更快的解決一些問題。一個(gè)變通方案是單獨(dú)處理,告知錯(cuò)誤詳情僅能通過瀏覽器控制臺(tái)查看,無法通過訪問。 前言 做好錯(cuò)誤監(jiān)控,將用戶使用時(shí)的錯(cuò)誤日志上報(bào),可以幫助我們更快的解決一些問題。目前開源的比較好的前端監(jiān)控有 https://docs.sentry.io/ 那前端監(jiān)控是怎么實(shí)現(xiàn)的呢?要想了解這個(gè),需要知道前端錯(cuò)誤大概分為哪些以及如...

    wqj97 評(píng)論0 收藏0
  • 詳解JS錯(cuò)誤處理:前端JS/Vue/React/Iframe/跨域/Node

    摘要:錯(cuò)誤上報(bào)機(jī)制發(fā)送數(shù)據(jù)因?yàn)檎?qǐng)求本身也有可能會(huì)發(fā)生異常,而且有可能會(huì)引發(fā)跨域問題,一般情況下更推薦使用動(dòng)態(tài)創(chuàng)建標(biāo)簽的形式進(jìn)行上報(bào)。 js錯(cuò)誤捕獲 js錯(cuò)誤的實(shí)質(zhì),也是發(fā)出一個(gè)事件,處理他 error實(shí)例對(duì)象 對(duì)象屬性 message:錯(cuò)誤提示信息 name:錯(cuò)誤名稱(非標(biāo)準(zhǔn)屬性)宿主環(huán)境賦予 stack:錯(cuò)誤的堆棧(非標(biāo)準(zhǔn)屬性)宿主環(huán)境賦予 對(duì)象類型(7種) Synt...

    張利勇 評(píng)論0 收藏0
  • 如何優(yōu)雅處理前端的異常?

    摘要:二需要處理哪些異常對(duì)于前端來說,我們可做的異常捕獲還真不少。總結(jié)一下,大概如下語法錯(cuò)誤代碼異常請(qǐng)求異常靜態(tài)資源加載異常異常異常跨域崩潰和卡頓下面我會(huì)針對(duì)每種具體情況來說明如何處理這些異常。 前端一直是距離用戶最近的一層,隨著產(chǎn)品的日益完善,我們會(huì)更加注重用戶體驗(yàn),而前端異常卻如鯁在喉,甚是煩人。一、為什么要處理異常?異常是不可控的,會(huì)影響最終的呈現(xiàn)結(jié)果,但是我們有充分的理由去做這樣的事...

    zoomdong 評(píng)論0 收藏0
  • 前端錯(cuò)誤監(jiān)控

    摘要:前端錯(cuò)誤監(jiān)控一錯(cuò)誤分類運(yùn)行時(shí)錯(cuò)誤這個(gè)錯(cuò)誤往往是在寫代碼是造成的。我知道錯(cuò)誤了在實(shí)際的使用過程中,主要是來捕獲預(yù)料之外的錯(cuò)誤,而則是用來在可預(yù)見情況下監(jiān)控特定的錯(cuò)誤,兩者結(jié)合使用更加高效。 前端錯(cuò)誤監(jiān)控 一、錯(cuò)誤分類 1.運(yùn)行時(shí)錯(cuò)誤:這個(gè)錯(cuò)誤往往是在寫代碼是造成的。如語法錯(cuò)誤、邏輯錯(cuò)誤等,這種錯(cuò)誤一般在測(cè)試過程也能夠發(fā)現(xiàn)。 2.資源加載錯(cuò)誤:這個(gè)錯(cuò)誤通常是找不到文件或者是文件加載超時(shí)造成...

    inapt 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<