5

try catchブロックインを使用していiced coffee scriptます。fake存在しないオブジェクトの存在しないメソッドを呼び出してa、エラーをキャッチすることを期待しています。

db = require '../../call/db.iced'
try
    await db.find "79", defer c, d
    a.fake()
catch error
    console.log "error catched"
    console.log error

しかし、関数 a.fake() を呼び出した後、コンソールでエラーがスローされますが、期待どおりにブロックがdb.find使用されません。try catch

文字列をコメントアウトするとawait db.find "79", defer c, d...

db = require '../../call/db.iced'
    try
        # await db.find "79", defer c, d ############## commented out
        a.fake()
    catch error
        console.log "error catched"
        console.log error

...期待どおりに動作し、エラーがキャッチされます。

他の単純な非同期関数呼び出しで文字列を変更しようとしawait db.find "79", defer c, dましたが、うまく機能し、エラーもうまくキャッチされました。

機能がしっかりしているのが面白いdb.find。文字列をコメントアウトするとa.fake()...

db = require '../../call/db.iced'
    try
        await db.find "79", defer c, d
        #a.fake() ################################ commented out
    catch error
        console.log "error catched"
        console.log error

... このスクリプトはエラーなしで動作するため、エラーをキャッチすることもありません。

function の後にエラーをキャッチできない理由がわかりませんawait db.find "79", defer c, d

4

1 に答える 1

1

ドキュメントには、次の ontry catchステートメントが記載されています。

唯一の例外は ですtry。これは、イベント ハンドラーからメイン ループで呼び出されたときに例外をキャッチしません。同じ理由で、手巻きの非同期コードとtry一緒にうまく動作しません。

db.findが非同期で呼び出されるため、コンストラクトtryはスレッドに残りdb.find、メイン スレッドにはとどまらないと思われます。これにより、説明した調査結果が得られます。

大雑把な解決策の 1 つは、両方の関数呼び出しをキャッチすることです。awaitただし、適切な使用方法は関数を使用することだと思いdeferます。説明については、ドキュメントを参照してください。

また、次の情報も役立つ場合があります。

可能な解決策

  1. 両方のステートメントを try キャッチで囲みます。

    try
        await db.find "79", defer c, d
    catch error
        console.log "error catched"
        console.log error
    try
        a.fake()
    catch error
        console.log "error catched"
        console.log error
    
  2. 上記のリンクで説明されているようdb.findに、try catch の外に配置し、別の方法でエラーを検出します。

    await db.find "79", defer err, id
    if err then return cb err, null
    
    try
        a.fake()
    catch error
        console.log "error catched"
        console.log error
    
于 2013-12-30T15:01:58.250 に答える