react native頁面出現錯誤時:
1、開發模式下,會出現紅色背景的頁面,展示當前**錯誤資訊
2、bundle模式下,則會出現白屏或者閃退
開發模式
bundle模式
主要使用兩種方法對rn頁面的異常進行捕獲並處理:
1、react error boundaries (異常邊界元件)
2、react native errorutils 模組
react error boundaries (異常邊界元件)是react 16 引入的新概念,為了避免react的元件內的ui異常導致整個應用的異常
對react的異常邊界元件不熟悉的小夥伴可以看看我的文章:從原始碼看react異常處理
這裡簡單介紹下:
error boundaries(異常邊界)是react元件,用於捕獲它子元件樹種所有元件產生的js異常,並渲染指定的兜底ui來替代出問題的元件
它能捕獲子元件生命週期函式中的異常,包括建構函式(constructor)和render函式
而不能捕獲以下異常:
直接上**:
...
function witherrorboundary(
errorcallback: function,
allowedindevmode: boolean,
opt: object = {})
componentdidcatch(error: error, errorinfo: any) )
errorcallback && errorcallback(error, errorinfo)
}handleleft = () =>
render() = opt
return (
this.state.visible && (allowedindevmode ? true : process.env.node_env !== 'development') ? (}}
}export default witherrorboundary;
複製**
上面是乙個react高階元件,返回的元件定義了componentdidcatch
生命週期函式,當其子元件出現異常時,會執行此componentdidcatch
生命週期函式,渲染兜底ui
...
import witherrorboundary from
'rn_components/exception_handler/with_error_boundary.js';
...class exceptionhandlerexample extends react.component
catch = () => );
}render ()
return (
style=>
title=
handleleft=/>
style=>
onpress=>
click metext>
view>
touchableopacity>
view>
view>);}
}// 異常邊界元件的使用
export default witherrorboundary(exceptionhandlerexample, (error, errorinfo) => , true);
複製**
上面我們也說過,異常邊界元件能捕獲子元件生命週期函式中的異常,包括建構函式(constructor)和render函式
而不能捕獲以下異常:
所以需要使用 react native errorutils 模組對這些異常進行捕獲並處理
react native errorutils 是負責對rn頁面中異常進行管理的模組,功能很類似web頁面中的 window.onerror
首先我們看看怎麼利用 react native errorutils 進行非同步捕獲和處理,直接上**:
const noop = () => {};
export
const setj***ceptionhandler = (customhandler = noop, allowedindevmode = false
) =>
const allowed = allowedindevmode ? true : !__dev__;
if (allowed)
};export
const getj***ceptionhandler = () => global.errorutils.getglobalhandler();
export
default ;
複製**
上面關鍵的**就兩行,在注釋中已標明
import from
'./error_guard';
import from
'react-native';
setj***ceptionhandler((e, isfatal) => ...`,[
}]);
} else
}, true);
複製**
使用很簡單,下面我們來看看errorutils
模組的原始碼
本文原始碼是2023年9月10日拉取的react native倉庫master分支上的**error_guard.js
首先看看 errorutils 的定義,原始碼位置:libraries/polyfills/error_guard.js
let _inguard = 0;
let _globalhandler = function
onerror(e) ;
const errorutils = ,
getglobalhandler() ,
reporterror(error) ,
reportfatalerror(error) ,
...};global.errorutils = errorutils;
複製**
上面只展示了我們使用了的方法,我們可以看到我們改寫的console.error
,即(message, error) => global.errorutils.reporterror(error)
,最終是執行的_globalhandler
所以通過這種方法可以捕獲到所有使用了console.error
的異常,我們來看看 react native 原始碼中什麼地方使用了 errorutils 來做異常捕獲和處理
messagequeue.js
來到messagequeue
原始碼,位置:libraries/batchedbridge/messagequeue.js
__guard(fn: () =>
void) else catch (error)
}}複製**
我們可以看到上面這個__guard
方法中使用了try...catch...
對函式的執行進行守護,當發生異常時,會呼叫errorutils.reportfatalerror(error);
對錯誤進行處理
使用了__guard
的地方這裡就不一一枚舉了,我們可以看看messagequeue
這個模組在rn中處於什麼位置
因為沒有系統的看過rn的原始碼,在網上找了個介紹 native 和 js 之間通訊的圖,我們可以看到messagequeue
在 native 和 js 之間通訊是很重要的模組
batchedbridge.js
來到batchedbridge
原始碼,位置:libraries/batchedbridge/batchedbridge.js
'use strict';
const messagequeue = require('messagequeue');
const batchedbridge = new messagequeue();
object.defineproperty(global, '__fbbatchedbridge', );
module.exports = batchedbridge;
複製**
熟悉rn的同學應該知道,batchedbridge
是 native 和 js 之間通訊的關鍵模組,從上面的原始碼我們可以知道,batchedbridge
實際就是messagequeue
例項
所以在messagequeue
模組中使用 errorutils 能捕獲到所有通訊過程中的異常並呼叫_globalhandler
處理
以上所有**可在個人開發的rn元件庫的專案中檢視到:rn_components exceptionhandler,元件庫現在才剛開始建設,後續會不斷完善
以上就是我對 react native 異常處理分享,希望能對有需要的小夥伴有幫助~~~
react native專案中時間計算異常問題
hermes存在部分機型,設定了時區,new date 返回值和jsc表現不一樣,有問題 描述 真機連線本地服務跑起來一切正常,斷開連線本地,就會有bug,由於new date導致算時間有問題,有相關時間計算的最後都顯示nan 機型 iphone11 oppo 等 原因 hermes有問題的時間格式...
struts 異常處理 全域性異常處理
記錄一下全域性異常處理的過程 處理主動丟擲的異常,轉向錯誤提示頁面。1 寫乙個自己的異常,繼承runtimeexception,從父類生成構造方法 package me.yndy.srtp.exception suppresswarnings serial public class errorexc...
python異常處理 Python 異常處理
使用者輸入不完整 比如輸入為空 或者輸入非法 輸入不是數字 異常就是程式執行時發生錯誤的訊號,在python中,錯誤觸發的異常如下 在python中不同的異常可以用不同的型別 python中統一了類與型別,型別即類 去標識,不同的類物件標識不同的異常,乙個異常標識一種錯 觸發indexerror 觸...