アプリケーションをプログラミングするとき、特にあるメソッドが他のメソッドを呼び出し、それが他のメソッドを呼び出す可能性がある場合、コードのどこにいるのかを知る必要があるかもしれません。そのため、デバッグの際にメソッドの連鎖、つまりコール チェーンを確認することは非常に有効です。このため、4D v17 R6では、新しい Get call chainコマンドを提供し、実行されたコードへの洞察を得ることができます。これで、もう迷子になる心配はありません!
このコマンドは、オブジェクトのコレクションを返します。各オブジェクトは、そのデータベース、メソッドタイプ、メソッド名、コールラインによって記述された実行ステップを表します。これは、解釈モードとコンパイルモードの両方で、すべてのコード実行コンテキストで使用することができます。
例
このように、エラーの原因を見つけることは、とても簡単になります。次のコールチェーンを見てください。 ON ERR CALL:
C_OBJECT
// Store the error in a file located in the database logs folder
$fileFolderfk logs folder($error;$file)
C_COLLECTION ($_callChain)
$_callChain :=Get call chain
$error :=New object
$error .timestamp:=Timestamp$error .method:=Error method
$error .error:=Error
$error .
line:=Error line
$error .
deep:=$_callChain.length
$error.
callChain:=$_callChain
xml-。file("error_"+Generate UUID+".json")
$file .
setText(JSON Stringify($error))
そして、その結果がこちらです。
[{ "timestamp": "2019-05-21T21:54:16.748Z", "method": "openDocument", "error": -43, "line": 3, "deep": 5, "callChain": [{ "type": "projectMethod", "name": "onError", "line": 3, "database": "Host_Database" }, { "type": "projectMethod", "name": "openDocument", "line": 3, "database": "Host_Database" }, { "type": "projectMethod", "name": "executeHostMethod", "line": 2, "database": "Component_Database" }, { "type": "formObjectMethod", "name": "detailForm.openButton", "line": 1, "database": "Host_Database" }, { "type": "projectMethod", "name": "showDetailForm", "line": 7, "database": "Host_Database" }] }]
OK。では、これをどのように読めばいいのだろうか。それはとても簡単です。
- ログはホストデータベースのonErrorメソッドの3行目に書き込まれました。
- それは、ホストデータベースのopenDocumentメソッドの 3 行目から呼び出されました。
- コンポーネントデータベースのexecuteHostMethodメソッドの 2 行目から呼び出されました。
- ホストデータベースのdetailForm.openButtonフォームオブジェクトメソッドの1行目から呼び出されました。
- ホストデータベースのshowDetailFormメソッドの3行目から呼び出されました。
使用例
このコマンドにはさまざまな使用例がありますが、ここではそのいくつかを紹介します。
- エラーチェック– エラーログシステムを含む “on error “メソッドをすでに使用していると思われます。4D v17 R6以前は、エラーコード、エラーメソッド、エラー発生行しか取得できませんでした。もし、そのメソッドがコード内の複数の場所から呼び出された場合、エラーが発生したコンテキストを理解することはかなり困難です。今、あなたは全体のコールチェーンを取得することができます!
- 分析– あるメソッドが他のいくつかのメソッドから呼び出され、それが最も頻繁に呼び出される場所を知りたい、実稼働環境において。あなたは今、何十行ものコードを書くことなく、メソッド呼び出しチェーンを記録し、後でその結果を分析することができます。パフォーマンスを低下させないためには、すべてのメソッドでコマンドを使用しないことです!
- NOTFOR CONDITIONAL DEVELOPMENT – この機能は、デバッグや最適化のためのものであることを心に留めておいてください。呼び出し元のメソッドに基づいた条件付き開発のためのものではありません。
範囲チェック
Get call chain は、インタプリタモードとコンパイルモードの両方で実行することができます。このコマンドは、レンジチェックをオンにしたときに、4D Compiler が生成する特別な情報を必要とします。このオプションを無効にすると危険(クラッシュの原因になる)なので、データベースの設定から削除しました。こうすることで、常に有効になっています。
しかし、承認された堅牢なコードで対応するコメントを使用することは可能です。
- 行から範囲チェックを無効にするには //%R- とします。
- その行の範囲チェックを無効にするには //%R+ とします。