Posted at

ReactNative のグローバルエラーハンドリング

More than 1 year has passed since last update.

一括でエラー処理はどうやるんだろう、と調べてみた。


global.ErrorUtils.setGlobalHandler での処理

名前の通りのグローバルハンドラ。

global.ErrorUtils.setGlobalHandler((error, isFatal) => {

});

で一括でハンドリングできる。なお __DEV__ のとき赤いモーダルエラー画面がでるのはここでハンドリングしてるからなので、上書きしたらそのエラーは無くなってしまう。


Promise での reject されたけど、だれもキャッチしないエラー処理

require('Promise'); // make sure the default rejection handler is installed

const rejectionTracking = require('promise/setimmediate/rejection-tracking');

rejectionTracking.enable({
allRejections: true,
onUnhandled: (id, error) => {
console.log('promise error');
console.error(error);
},
});

で一括処理できる。ただ、これだとすべてのエラーをハンドリングしてしまうことになってしまう。ので whitelist にエラークラスを指定することで、特定の処理だけをハンドリングすることが出来る。

が、このハンドラーも一つしかセットできないので、エラーごとにハンドラーをセットは出来ず、whitelist にハンドリングするクラスを増やしていく感じになってしまうと思う。

import ExtendableError from 'es6-error';

class NetworkError extends ExtendableError {
constructor(message = 'Network Error') {
super(message);
}
}

require('Promise'); // make sure the default rejection handler is installed
const rejectionTracking = require('promise/setimmediate/rejection-tracking');

rejectionTracking.enable({
allRejections: false,
whitelist: [NetworkError],
onUnhandled: (id, error) => {
console.log('Network Error');
console.log(error);
},
});

(async () => {
throw new NetworkError();
})();


使いどころ

ここをハンドリングしてうまくアプリを作っていくのはなんか間違ってる感が強いので、エラーのロギング以外では使わない方が良い。