例外・エラー処理
SDK がスローする例外は、すべてRevolution\Copilot\Exceptions 名前空間にあります。発生のしかたは2通りあり、セッションの実行結果に保持されて throw() でスローされるものと、RPC 呼び出しなどでその場でスローされるものがあります。
セッションのエラーとタイムアウト
sendAndWait() や Copilot::run() では、セッションエラーやタイムアウトが発生してもその場ではスローされず、返ってきた SessionEvent に例外が保持されます。Laravel の Http や Process と同様に throw() を呼ぶと保持された例外がスローされ、エラーでないときは何もしないので、そのままメソッドチェーンを続けられます。
failed() と successful() が使えます。詳しくは SessionEvent を参照してください。
SessionTimeoutException
session.idle(応答の完了)を待つ間にタイムアウトすると保持されます。タイムアウトは sendAndWait() の timeout 引数で指定でき、省略した場合は copilot.timeout 設定(デフォルトは60秒)が使われます。
SessionErrorException
セッションがSESSION_ERROR イベントでエラーを返すと保持されます。メッセージにはランタイムから返されたエラーの内容が含まれます。
JsonRpcException
RPC 呼び出しに対して CLI が JSON-RPC エラーを返すと、その場でスローされます。JSON-RPC のエラーコードはcode プロパティ、エラーに付随するデータは data プロパティで取得できます。
SessionFsSqliteTransactionFailure
SessionFs の SQLite プロバイダーを実装する場合に使う例外です。捕捉するものではなく、プロバイダーのtransaction() からスローして失敗の分類をランタイムへ伝えます。分類は errorClass で指定します。
Fatal(デフォルト): 回復不能な失敗BusyOrLocked: コミット前に SQLite が BUSY/LOCKED を返し、トランザクションがロールバックされた場合のみ使いますPostCommitAmbiguous: コミット後の結果が確定できない場合
transaction() からスローすると、fatal として報告されます。