web-dev-qa-db-ja.com

Catchステートメントはスローされたエラーをキャッチしません

何らかの理由で、このコードはキャッチされない例外エラーを返します。 catchブロックがエラーをキャッチしていないようです。 catchブロックのスコープは、ネストされた関数でエラーをスローできないようにスコープされ、チェーンの上位にスコープされたcatchステートメントによってキャッチされることを期待していますか?私が作業しているアプリケーションの機密データの一部は削除されましたが、leadInfo [0/1]はURLパラメーターから取得した32文字の英数字の文字列であると予想されていました。

ここでの根本的な問題は、APIからエラーを返すmy AJAX呼び出しと、そのエラーがアプリケーション内で適切に処理されないことです。したがって、throwステートメントが必要です。AJAX呼び出しは正常に完了し、プロパティとしてメールアドレスを含まないJSONオブジェクトを返すため、ページを変更してそれを反映するように処理する必要があります。

    jQuery(document).ready(function(){
        try {
            url = "http://api.com/api/v1/lead/" + leadInfo[1]

            jQuery.ajax({
                type: 'GET',
                contentType: 'application/json',
                url: url,
                dataType : 'jsonp',
                success: function (result) {

                    result = jQuery.parseJSON(result);

                    if(!result.data.email){
                        throw ('New exception');
                    }
                    console.log(result);
                    jQuery('.email').html(result.data.email);
                }
            });


            jQuery('.surveryButton').click(function(){
                window.location.replace("http://" + pgInventory.Host + pgInventory.path + leadInfo[0] + "&curLeadId=" + leadInfo[1] + "&curViewedPages=0");
            });
        }
        catch(err) {
            jQuery('.email').html('your e-mail address');
            jQuery('#arrowContent').remove();
        }
});
24
Xenology

try catchブロックが失敗する理由は、ajaxリクエストが非同期であるためです。 try catchブロックはAjax呼び出しの前に実行され、リクエスト自体を送信しますが、結果が返されるとエラーがスローされますAT A LATER POINT IN TIME。

try catchブロックが実行されるとき、エラーはありません。エラーがスローされた場合、try catchはありません。 Ajaxリクエストにtry catchが必要な場合は、常にsuccessコールバック内にajax try catchブロックを配置してください。

方法は次のとおりです。

success: function (result) {
    try {
      result = jQuery.parseJSON(result);

      if (!result.data.email) {
         throw ('New exception');
      }
      console.log(result);
      jQuery('.email').html(result.data.email);
    } catch (exception) {
      console.error("bla");
    };
}
57
flavian

問題は、ajaxが定義上非同期であることです。例外は_$.ajax_関数内からスローされるのではなく、成功時にcallback関数からスローされます(後でトリガーされます)。

サーバー応答エラーを処理するために、error: function(data) {}パラメーターも指定する必要があり、さらにtry/catchブロックを配置する必要がありますinsideコールバック関数。

本当にコールバックの外側でキャッチしたい場合は、例外をスローするのではなく、関数の呼び出しを検討する必要があります。どのようにすればよいかわかりません。

1
MarioDS

Javascriptのコールバックメソッドは非同期であるため、エラーをスローする関数のコンテキストは元のものとは異なります。次の方法で行う必要があります。

success: function (result) {
  try {
    result = jQuery.parseJSON(result);
    if(!result.data.email){
      throw ('New exception');
    }
    console.log(result);
    jQuery('.email').html(result.data.email);
  }
  catch(err) {
    // Dealing with the error
  }
}

この素晴らしい 記事 について(非常に特定の)contextsclosuresおよびJavascriptのbindings

1
jap1968