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