コアコンセプト / エラー処理

エラー処理

NativeScriptコアモジュールでのエラー処理

WebアプリケーションとNativeScriptアプリケーションの大きな違いは、エラーの処理方法です。 現在、未処理の例外がNativeScriptでスローされると(内部tns-core-modules、プラグイン、アプリで使用、またはアプリケーションコードなど)、アプリがクラッシュし、対応するスタックトレースのエラーが表示されます。 場合によっては、これはアプリが開発モードにあるときの予想される動作のようです。 予期しないエラーが発生した正確な場所のスタックトレースを取得して、何が発生したかをより簡単に理解し、問題を修正できるようにすることができます。 ただし、アプリが運用環境にある場合、同様のアプリケーションがクラッシュすると、アプリケーションの信頼性が著しく損なわれ、顧客を失う可能性があります。 エラーログを使用した実際のクラッシュよりも、他のもの(アプリのフリーズ、空白の画面、ナビゲーションの失敗など)の方が好ましい場合があります。

この問題に関して、NativeScriptに新しいAPIが導入されました。 これは、アプリの開発中および運用中にさまざまな方法でエラーを処理する機能を提供します。 APIの作成中に、次の3つのシナリオが考慮されています。

  1. (開発モード)エラーが発生するとすぐに例外をスローします。
  2. (開発モード)console.logに怖いメッセージ「エラー:何か問題が発生しましたが、アプリの実行を続行します」と表示します。 コンソールに表示されますが、その後アプリで何が起こるかを知り、問題が重要かどうかを判断する基礎となる情報を提供します。
  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でのエラー処理の詳細については、こちらを参照してください。

ネイティブへのキャッチされていないJS例外の再スローを無効にする

discardUncaughtJsExceptionsというプロパティがNativeScript 4.2で導入されました。 ネイティブから呼び出されたJavaScriptコードからの未処理の例外をキャッチするかどうかを構成できます。 このオプションはデフォルトで無効になっています。 有効にするには、app/package.jsonファイル内でdiscardUncaughtJsExceptionsプロパティをtrueに設定する必要があります。

このスイッチをオンにすると、JS例外がネイティブの世界に伝播されることなくキャッチされ、アプリのクラッシュを効果的に保護します。 破棄されたすべての例外は、application.discardedErrorEventを介してアプリに報告されます。 この機能の詳細については、ネイティブセクションから呼び出された場合のJavaScript例外の破棄(こちら)を参照してください。

注釈: このプロパティを有効にすると、致命的な例外が破棄される可能性があります。 これにより、アプリケーションが不安定になり、予期しない動作が発生し、元の問題のクラッシュとは無関係の追跡とデバッグが困難になります。 適切な例外処理のために、デフォルト設定を維持し、キャッチされていないJS例外がトップレベルのネイティブコードにエスケープしないようにすることをお勧めします。
入門

コアコンセプト

ユーザーインターフェース

ツール

ハードウェアアクセス

プラグインの開発

リリース

アプリテンプレート

パフォーマンスの最適化

フレームワークモジュール

ガイド

サポートを受ける

トラブルシューティング

Siedkick