VB.NET Web请求try-catch使用报错及404异常捕获问题求解
错误原因定位
你之前的改动存在两个核心问题,直接导致编译失败、异常无法捕获:
- 异常捕获范围错位:已知404异常会在
request.GetResponse()调用行触发,你调整代码时把这行放到了Try块外部,哪怕后续编写了Catch逻辑,也完全拦截不到发生在块外的异常。 - 变量作用域不匹配:你在Try块内部用
Dim声明的dataStream,有效范围仅覆盖Try块内部,代码离开Try块后,该变量就会被销毁,外部代码无法访问,因此触发“dataStream未声明”的编译报错。
正确的异常捕获实现
按照以下规则调整代码即可同时解决编译问题和404异常中断程序的问题:
- 所有需要跨代码块使用的变量,提前在Try块外部声明,确保变量在全流程有效
- 把所有可能触发HTTP错误的代码(从发起请求获取响应,到读取返回内容)全部纳入Try块的覆盖范围
- 精准捕获
WebException类型的异常(WebRequest触发404、500等HTTP错误时抛出的专用异常类型),不要盲目捕获所有类型的异常,避免隐藏实际代码bug - 通过
Finally块强制释放流、响应对象等非托管资源,无论正常执行还是触发异常都不出现资源泄漏
调整后的可用代码如下:
Sub scrape(target$) ' 在块外提前声明跨作用域使用的变量,避免出块失效 Dim request As WebRequest = WebRequest.Create(target$) Dim response As WebResponse = Nothing Dim dataStream As Stream = Nothing Dim reader As StreamReader = Nothing Try ' 所有可能抛出HTTP异常的逻辑全部纳入Try覆盖范围 response = request.GetResponse() dataStream = response.GetResponseStream() reader = New StreamReader(dataStream) Dim responseFromServer As String = reader.ReadToEnd() txtResponse.Clear() txtResponse.Text = responseFromServer Catch ex As WebException ' 捕获404等HTTP协议错误 exflag = True txtResponse.Text = "请求失败:" & ex.StatusCode.ToString() Finally ' 无论正常执行还是触发异常,强制释放资源 reader?.Close() dataStream?.Close() response?.Close() End Try End Sub
补充说明:所有可能抛出预期异常的代码行,必须在Try的覆盖范围内才能被拦截,把
GetResponse()放在Try块外的写法本身就违背了异常捕获的设计逻辑。
内容的提问来源于stack exchange,提问作者user3111176
相关产品推荐
相关产品推荐

