【发布时间】:2023-03-07 09:39:01
【问题描述】:
所以我在 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()。 -
我知道
using声明,但我决定暂时跳过它,因为这里已经有足够的左括号和右括号了。使用Dispose()而不是using语句是否有某种风险? -
using打开自己的范围,并且只有在这个范围内相应的变量才有效。如果您手动调用Dispose,则没有什么能阻止您以后使用该变量。所以简而言之,正确使用,初始化你的变量,然后在它上面调用Dispose,然后再也不使用它就像using一样好。但是,using允许人为错误的余地较小。 -
明白了。感谢您的提示。
标签: c# httpwebrequest ioexception checked-exceptions