【发布时间】:2019-11-12 13:03:50
【问题描述】:
在我的应用程序中,我的 REST 调用得到了 System.NullReferenceException。 此错误是由 Catch 块中的代码引起的。 在 Catch 块中放置另一个 try catch 块是个好主意吗? 在下面的代码中,Catch 块中的以下代码行抛出错误。
resultObject.ErrorResponse = _client.GetErrorResponse(Of List(Of ErrorResponseObject))(ex, "{""errors"":")
如何解决此问题,以便用户看不到任何错误。 这是我的代码。
Public Shared Function POSTCall()
_client = New BaseClient()
Try
strJsonResponse = _client.ExecuteURI(serviceUrl, requestHeader, "POST", resultObject, False, False)
Catch ex As WebException
resultObject.ErrorResponse = _client.GetErrorResponse(Of List(Of ErrorResponseObject))(ex, "{""errors"":") 'This line causing error
If Not IsNothing(resultObject.ErrorResponse) Then
' do some work
End If
Catch Exp As Exception
'Supress the error. Let user goto next step.
Finally
_client = Nothing
End Try
Return resultObject
End Function
【问题讨论】:
-
很少会抛出
NullReferenceException,因为您通常应该首先通过空传播或If运算符显式检查引用是否为空。你显然已经知道如何做到这一点,因为你正在下一行做,即使这不是最好的方法。可能在某些情况下它是有意义的,如果这是其中之一,Catch块内的异常处理程序是可以的。 -
是
_client为null的问题,还是GetErrorResponse抛出NullRefException的问题?如果是后者,鉴于此处的用法并假设您控制该函数,它似乎是该函数中可能抛出的错误。如果是前者,请在尝试使用该对象时对其进行测试,而不是让它绊倒。 -
顺便说一句,没有充分的理由使用
IsNothing函数,而您可以只使用运算符形式Is Nothing。另外,现在有一个IsNot运算符,所以你可以直接说If resultObject.ErrorResponse IsNot Nothing,这样更容易阅读。 -
_client 不为空。超时时会发生此问题。您认为添加第三个 Catch 块(如“Catch nullRefEx As NullReferenceException”)会解决问题吗?
-
我想它会解决这个问题,但如果你能做到这一点会更好,这样根本就没有 NullRefException。问题必须在
GetErrorResponse内——在这种情况下,我建议修复GetErrorResponse以便它返回有用的东西而不是抛出——或者resultObject为空——在这种情况下,您会遇到 Eric Lippert 所说的愚蠢异常,无需昂贵的 try-catch 即可轻松解决。