AJAX:当函数调用失败/错误时,是不是可以从服务器端返回自定义错误消息? [复制]

Posted

技术标签:

【中文标题】AJAX:当函数调用失败/错误时,是不是可以从服务器端返回自定义错误消息? [复制]【英文标题】:AJAX: is it possible to return a custom error message from server side when the function call fails/errors? [duplicate]AJAX:当函数调用失败/错误时,是否可以从服务器端返回自定义错误消息? [复制] 【发布时间】:2020-03-29 13:47:55 【问题描述】:

我有一个对 vb 函数的 ajax 调用。 vb 函数失败,因为查询中提到的数据表 TABLE_ONE 在数据库中不存在。

我希望将来自 vb 中 catch 的错误消息返回到 ajax 的“错误”,以便我可以向用户显示该错误。原因是VB中的错误消息准确地指出数据库中不存在该表,而实际上从这里向用户显示的错误

error: function (a, b, c) 
            alert("Ajax call to multiAjax failed: " + a);
        

不会告诉用户错误是由于表不存在造成的。 ajax报错信息没用。

如何将 vb catch 的错误信息显示给用户?

谢谢

ajax:

function multiAjax(funcName, queryName, onSuccess) 
    var result = null;
    $.ajax(
        type: "POST",
        url: "WebService1.asmx/" + funcName,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (Response) 
            onSuccess(Response)
        ,
        data: JSON.stringify( "queryName": queryName ),
        error: function (a, b, c) 
            alert("Ajax call to multiAjax failed: " + a);
        
    );

VB

<WebMethod(EnableSession:=True)>
    Public Function getQueryNo()
        Try
            Dim queryNumberSql As String
            Dim queryNo As Integer

            Using dr As New DataReader(dif)
                queryNumberSql =
                "SELECT min(unused) AS unused
            FROM (
                 SELECT MIN(t1.QUERY_NUMBER)+1 as unused
                 FROM TABLE_ONE AS t1
                 WHERE NOT EXISTS (SELECT * FROM TABLE_ONE AS t2 WHERE t2.QUERY_NUMBER = t1.QUERY_NUMBER+1)
                 UNION
                 -- Special case for missing the first row
                 SELECT 1
                 FROM TABLE_ONE AS t1
                 WHERE NOT EXISTS (SELECT * FROM TABLE_ONE WHERE QUERY_NUMBER = 1)
            ) AS subquery"

                dr.ExecuteReader(queryNumberSql)
                While dr.Read()
                    queryNo = Integer.Parse(dr("unused"))
                End While

                Return queryNo
            End Using
        Catch ex As Exception
            Console.WriteLine($"Error trying to set query number: ex")
            Return ex
        End Try
    End Function

【问题讨论】:

这里是VB版本:***.com/a/2088134/2181514 您的“vb 中的错误消息”只是一个 console.writeline - 这是不可转让的。您需要使用正确的消息引发异常,例如Catch ex as Exception Throw New ApplicationException("Error trying to set number", ex) - 但是 - 这可能会被您的服务器端配置(web.config 设置)吞噬/隐藏 - 或者使用上面链接中的 Response.StatusCode/StatusDescription。 此外,您实际上并没有查看error: 的有用参数 - 在您的代码error:function(a,b,c) alert(a) 中还要查看 b 和 c,或者更具体地说:error: function(jqXHR, textStatus, errorThrown) 客户端错误处理器中a、b、c的值是多少? @freedomn-m,非常感谢! Response.StatusCode/StatusDescription 有效。 【参考方案1】:

这取决于您最初用来发出请求的库/实现。如果服务器发送错误代码,例如 500,某些库会拒绝。

虽然被认为是不好的做法,但发送错误代码可能是您想要的。 (只是不要在 api 中使用它!!)

【讨论】:

我只想将来自 vb 的错误消息显示给用户,由于它是服务器端代码,因此似乎没有直接的方法【参考方案2】:

@freedomn-m 提供的解决方案:

ajax:

function multiAjax(funcName, queryName, onSuccess) 
    var result = null;
    $.ajax(
        type: "POST",
        url: "WebService1.asmx/" + funcName,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (Response) 
            onSuccess(Response)
        ,
        data: JSON.stringify( "queryName": queryName ),
        error: function (jqXHR, textStatus, errorThrown)            
                alert(jqXHR.responseText);          
        
    );

VB:

Public Function getQueryNo()
        Try
            Dim queryNumberSql As String
            Dim queryNo As Integer

            Using dr As New DataReader(dif)
                queryNumberSql =
                "SELECT min(unused) AS unused
            FROM (
                 SELECT MIN(t1.QUERY_NUMBER)+1 as unused
                 FROM CFG_QUERY_REPORT AS t1
                 WHERE NOT EXISTS (SELECT * FROM CFG_QUERY_REPORT AS t2 WHERE t2.QUERY_NUMBER = t1.QUERY_NUMBER+1)
                 UNION
                 -- Special case for missing the first row
                 SELECT 1
                 FROM CFG_QUERY_REPORT AS t1
                 WHERE NOT EXISTS (SELECT * FROM CFG_QUERY_REPORT WHERE QUERY_NUMBER = 1)
            ) AS subquery"

                dr.ExecuteReader(queryNumberSql)
                While dr.Read()
                    queryNo = Integer.Parse(dr("unused"))
                End While

                Return queryNo
            End Using
        Catch ex As Exception
            HttpContext.Current.Response.StatusCode = 400
            HttpContext.Current.Response.Write(ex)
        End Try
    End Function

【讨论】:

以上是关于AJAX:当函数调用失败/错误时,是不是可以从服务器端返回自定义错误消息? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

CORS - jQuery 获取 ajax 响应状态失败

jQuery Ajax 操作函数

jQuery Ajax

jQuery Ajax 操作函数汇总

来自 ajax 的 Web api Post 调用失败

当 ajax 调用失败时,如何阻止 Bootstrap x-editable 更新已编辑的字段?