我正在使用System.Net程序集中的HttpWebRequest API,但由于C#没有检查异常,我不确定应该在哪里放置try-catch块来正确处理由常见问题(如网络错误)引起的必然异常。在Java中,我们将这些称为普通的已检查IOExceptions。
以下是我的尝试。我的try-catch块是否正确设置以处理网络错误?我是否包装了正确的方法调用?根据文档,我认为它们是正确的,但我需要第二个人审查。
HttpWebRequest request = WebRequest.CreateHttp(url);
request.Method = "POST";
request.BeginGetRequestStream(getRequestResult =>
{
HttpWebRequest getRequestRequest = (HttpWebRequest) getRequestResult.AsyncState;
try
{
Stream requestStream = getRequestRequest.EndGetRequestStream(getRequestResult);
requestStream.Write(parametersData, 0, parametersData.Length);
requestStream.Dispose();
getRequestRequest.BeginGetResponse(getResponseResult =>
{
HttpWebRequest getResponseRequest = (HttpWebRequest)getResponseResult.AsyncState;
try
{
WebResponse response = getResponseRequest.EndGetResponse(getRequestResult);
Stream responseStream = response.GetResponseStream();
StreamReader reader = new StreamReader(responseStream);
string jsonString = reader.ReadToEnd();
reader.Dispose();
JObject jsonObject = JObject.Parse(jsonString);
onResult(StatusCode.Ok, jsonObject);
}
catch (WebException)
{
onResult(StatusCode.NetworkError);
}
}, getRequestRequest);
}
catch (IOException)
{
onResult(StatusCode.NetworkError);
}
}, request);
Dispose
时应该总是使用using
。所以你应该对responseStream
和reader
进行using
,而不是手动调用Dispose()
。 - Jan Dörrenhaususing
语句,但因为这里已经有足够的开放和关闭括号了,所以我决定暂时跳过它。使用Dispose()
代替using
语句是否存在风险? - AxiomaticNexususing
可以打开自己的作用域,在该作用域内才能使用相关变量。如果您手动调用Dispose
,则可以随后再次使用该变量。简而言之,如果正确使用,初始化变量,然后调用Dispose
并且不再使用它,就像使用using
一样好。但是,相比之下,using
对人为错误的容忍度更小。 - Jan Dörrenhaus