web-dev-qa-db-ja.com

Chrome APIを使用する場合の未確認のruntime.lastError

私が使う chrome.fileSystemファイルを開くアプリのAPI。ファイル選択ダイアログのCancelボタンをクリックすると、エラーが発生します。

未チェックruntime.lastError実行中fileSystem.chooseEntry:ユーザーがキャンセルされました

このエラーを修正するには?

24
zcfrank1st

この場合、このエラーは重要ではありませんが、そのエラーとその解決方法を説明します。

このエラーは何ですか?

Chrome APIはほとんど非同期です。操作が完了すると呼び出されるコールバックがあります。

chrome.fileSystem.chooseEntryの場合、選択されたエントリはコールバックに渡されます:

chrome.fileSystem.chooseEntry(
  {/* options */},
  function(entry) {
    // This is the callback for the API call; you can do something with entry
  }
);

ただし、APIは結果を生成する保証ではありません。たとえば、あなたの場合のように、ユーザーは「キャンセル」をクリックしてアクセスの提供を拒否できます。次に、使用するエントリはありません。その理由を説明する必要があります。追加の「エラー」引数ですべてのコールバックを汚染せずにエラーを発生させる方法は?

通常、Chromeは、コールバックが呼び出されるときにグローバル変数chrome.runtime.lastErrorを設定することでこれを処理します。Chrome非同期APIは、エラー引数の代わりにこれを使用します。実際、chrome.fileSystemドキュメントを引用する:

すべての失敗は、chrome.runtime.lastErrorを介して通知されます。

  • すべて問題なければ、undefinedになります。
  • 問題がある場合、それは空ではなく、chrome.runtime.lastError.messageは何が悪いのかを説明します。

ただし、一部のコールバックはこのエラー変数をチェックしませんでした。これはプログラミングエラーを示している可能性があり、Chrome=コールバックでchrome.runtime.lastErrorが実際にチェック(評価)されることを確認するチェックが追加されました。このエラー。

なぜ重要ではないと言うのですか?

エラーではありますが、プログラムの実行を中断せず(非同期タスクの最後にスローされます)、ユーザーに実際に表示されることはありません。

それは重要ではないと言いますが、プログラムのロジックを確認する必要があります。大丈夫かもしれないし、そうでないかもしれない-これは(厳しい)警告であることを意図している。

なぜ存在するのですか?

警告するために、you、開発者は、コードがおそらくしない結果を使用しようとする何かがうまくいかなかったからです。

すでにエラーをチェックしている可能性があります。

if (entry) {
  // Process entry
} else {
  // Something went wrong (but what?)
}

Chromeは、コードがこの可能性を期待しているかどうかを確認するために複雑なヒューリスティックを採用していません。前述のように、エラーはchrome.runtime.lastErrorを介して報告され、確認する必要があります。

このエラーは、何か悪いdoesが発生した場合にのみ発生し、API呼び出しが正常に終了した場合には発生しないことに注意してください。

キャッチできますか?

あんまり;コードでは発生しませんが、Chrome API;の非同期タスクを処理するクリーンアップコードです。したがって、コールバックでtry ... catchを使用しても役に立ちません。非同期なので、try元のAPI呼び出しの周りも助けにはなりません。

それをどうするか?

Chromeが期待する方法で問題をチェックし、おそらくそれに反応するロジックをコールバックに追加する必要があります。

function(entry) {
  if(chrome.runtime.lastError) {
    // Something went wrong
    console.warn("Whoops.. " + chrome.runtime.lastError.message);
    // Maybe explain that to the user too?
  } else {
    // No errors, you can use entry
  }
}

Chromeは、エラーが発生したときに値をチェックしたである(つまり、コールバック)、エラーはスローされません。

57
Xan

パーティーに遅刻しましたが、他の人を助けるために、chrome.windows.remove()呼び出しでエラーを抑制した方法を以下に示します。の代わりに

_chrome.windows.remove(foo);  // unconditional; runtime.lastError not checked
_

使った

_chrome.windows.remove(
        foo,
        function ignore_error() { void chrome.runtime.lastError; }
);
_

void は、オペランドを評価し、undefinedを返します。このコードは、その目的がエラーを無視することであることをかなり効果的に文書化していると思います:)。

簡潔にするために、ignore_error()をこの呼び出しから引き出して複数のchrome AP​​I呼び出しに使用するか、名前_ignore_error_を省略できます。

UpdateES6では、より短い arrow function 構文を使用できます。

_chrome.windows.remove( foo, ()=>void chrome.runtime.lastError );
_

テスト済みChrome 64

5
cxw

このタイプのエラーの場合、try catchは役に立ちません。その代わり、グローバル変数chrome.runtime.lastErrorにアクセスすることができます(@xanが上記の素晴らしい応答で述べたように)(あなたはそれを読んで、それを支持するべきです!)。

さて、ここで使用できる例を提供します:

function catchLastError(){
  if(chrome.runtime.lastError){
    console.log("error: ", chrome.runtime.lastError);
  }else{
    // some code goes here.
  }
}

chrome.fileSystem.chooseEntry(yourEntry,catchLastError);
0
ismnoiet