WebアプリケーションとNativeScriptアプリケーションの大きな違いは、エラーの処理方法です。 現在、未処理の例外がNativeScriptでスローされると(内部tns-core-modules、プラグイン、アプリで使用、またはアプリケーションコードなど)、アプリがクラッシュし、対応するスタックトレースのエラーが表示されます。 場合によっては、これはアプリが開発モードにあるときの予想される動作のようです。 予期しないエラーが発生した正確な場所のスタックトレースを取得して、何が発生したかをより簡単に理解し、問題を修正できるようにすることができます。 ただし、アプリが運用環境にある場合、同様のアプリケーションがクラッシュすると、アプリケーションの信頼性が著しく損なわれ、顧客を失う可能性があります。 エラーログを使用した実際のクラッシュよりも、他のもの(アプリのフリーズ、空白の画面、ナビゲーションの失敗など)の方が好ましい場合があります。
この問題に関して、NativeScriptに新しいAPIが導入されました。 これは、アプリの開発中および運用中にさまざまな方法でエラーを処理する機能を提供します。 APIの作成中に、次の3つのシナリオが考慮されています。
APIでは、traceモジュールはerror()と呼ばれる新しいメソッドで拡張されます。このメソッドは、たとえばプラグインで使用でき、JavaScriptエラーを渡してアプリケーションコードで処理できます。
例:function doSomething(arg) {
// Instead of throwing the error
// **if(!arg) throw new Error("Arg not provided in "doSomething");**
// we can use the new **trace.error()**
if(!arg) {
trace.error("Arg not provided in "doSomething");
return;
}
// ... implementation using arg
}
この例は、クラッシュを引き起こす可能性のあるエラーをスローする代わりに、プラグインのコード内でerrorメソッドを使用する方法を示しています。
このAPIには、開発者がカスタムエラーハンドラロジックを定義できる手法も導入されています。 この場合、trace.error(...)が呼び出されるたびにErrorHandlerが呼び出されます。 デフォルトのエラーハンドラは、エラーが発生するとすぐにthrowします。
例:import "./bundle-config";
import * as application from "tns-core-modules/application";
import * as traceModule from "tns-core-modules/trace"
const errorHandler: traceModule.ErrorHandler = {
handlerError(err){
//option 1 (development) - throw the error
throw err;
//option 2 (development) - logging the error via write method provided from trace module
traceModule.write(err, "unhandled-error", type.error);
//(production) - custom functionality for error handling
//reportToAnalytics(err)
}
}
traceModule.setErrorHandler(errorHandler)
application.run({ moduleName: 'app-root' });
この例は、カスタムハンドラーを定義する方法と、traceモジュール経由またはカスタム機能の使用中にエラーを処理するための3つの可能なオプションを示しています。
NativeScriptでのエラー処理の詳細については、こちらを参照してください。
discardUncaughtJsExceptionsというプロパティがNativeScript 4.2で導入されました。 ネイティブから呼び出されたJavaScriptコードからの未処理の例外をキャッチするかどうかを構成できます。 このオプションはデフォルトで無効になっています。 有効にするには、app/package.jsonファイル内でdiscardUncaughtJsExceptionsプロパティをtrueに設定する必要があります。
このスイッチをオンにすると、JS例外がネイティブの世界に伝播されることなくキャッチされ、アプリのクラッシュを効果的に保護します。 破棄されたすべての例外は、application.discardedErrorEventを介してアプリに報告されます。 この機能の詳細については、ネイティブセクションから呼び出された場合のJavaScript例外の破棄(こちら)を参照してください。