私が使う chrome.fileSystem
ファイルを開くアプリのAPI。ファイル選択ダイアログのCancel
ボタンをクリックすると、エラーが発生します。
未チェック
runtime.lastError
実行中fileSystem.chooseEntry
:ユーザーがキャンセルされました
このエラーを修正するには?
この場合、このエラーは重要ではありませんが、そのエラーとその解決方法を説明します。
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は、エラーが発生したときに値をチェックしたである(つまり、コールバック)、エラーはスローされません。
パーティーに遅刻しましたが、他の人を助けるために、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
API呼び出しに使用するか、名前_ignore_error
_を省略できます。
UpdateES6では、より短い arrow function 構文を使用できます。
_chrome.windows.remove( foo, ()=>void chrome.runtime.lastError );
_
テスト済みChrome 64
このタイプのエラーの場合、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);