C#我应该在try-catch中使用try-catch来处理响应吗?这是个坏主意吗?
我的代码处理一些restapi(GET方法)。此GET方法返回如下响应:C#我应该在try-catch中使用try-catch来处理响应吗?这是个坏主意吗?,c#,.net,model,try-catch,C#,.net,Model,Try Catch,我的代码处理一些restapi(GET方法)。此GET方法返回如下响应: {"error":0,"Logs":[{"LoggerIdx":"91","OfficeID":"MIA1A0955","Agent":"581A78AD"}]} 如果查询没有找到任何内容,则返回: {"error":0,"Logs":[{"No values found"}]} 我使用调用此API来检索值并显示报告的代码是: private string uri = "http://localhost";
{"error":0,"Logs":[{"LoggerIdx":"91","OfficeID":"MIA1A0955","Agent":"581A78AD"}]}
如果查询没有找到任何内容,则返回:
{"error":0,"Logs":[{"No values found"}]}
我使用调用此API来检索值并显示报告的代码是:
private string uri = "http://localhost";
public async Task<List<T>> GetWSObjects<T>(string uriActionString)
{
return new List<T> { await this.GetWSObject<T>(uriActionString) };
}
public async Task<T> GetWSObject<T>(string uriActionString)
{
T returnValue =
default(T);
try
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri(uri);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage response = await client.GetAsync(uriActionString);
response.EnsureSuccessStatusCode();
returnValue = JsonConvert.DeserializeObject<T>(((HttpResponseMessage)response).Content.ReadAsStringAsync().Result);
}
return returnValue;
}
catch (Exception e)
{
throw (e);
}
}
最好的处理方法是在解析响应之前检查响应:
var responseString = await ((HttpResponseMessage)response).Content.ReadAsStringAsync();
if(response.ToLower().Contains("no values found")) {
//do something here like returning an empty model
}
else
{
returnValue = JsonConvert.DeserializeObject<T>(responseString);
}
var responseString=await((HttpResponseMessage)response.Content.ReadAsStringAsync();
if(response.ToLower()包含(“未找到值”)){
//在这里执行一些操作,例如返回空模型
}
其他的
{
returnValue=JsonConvert.DeserializeObject(responseString);
}
最好的处理方法是在解析响应之前检查响应:
var responseString = await ((HttpResponseMessage)response).Content.ReadAsStringAsync();
if(response.ToLower().Contains("no values found")) {
//do something here like returning an empty model
}
else
{
returnValue = JsonConvert.DeserializeObject<T>(responseString);
}
var responseString=await((HttpResponseMessage)response.Content.ReadAsStringAsync();
if(response.ToLower()包含(“未找到值”)){
//在这里执行一些操作,例如返回空模型
}
其他的
{
returnValue=JsonConvert.DeserializeObject(responseString);
}
在您的catch
块中,记录或以其他方式捕获异常,但如果显示此方法的返回值(从您发布的内容来看似乎是这样),则不要抛出
。然后为您的模型编写一条友好的消息(我假设这就是stringmessage1
属性的用途?如果不是,您可以为它添加一个属性来实现这一目的)。这样,您的用户将看到您所写的内容,这些内容比异常的细节更容易理解
至于做另一个尝试-你可以,但这不是必要的。JsonConvert.DeserializeObject
引发的异常最终将属于Exception
类型,并将被您的catch
捕获。如果要捕获特定的异常类型,请在异常捕获块之前放置另一个catch语句,并以相同的方式处理它
关于如何重新抛出(您当前的代码就是这样做的)的文章和意见到处都是——做一些研究,找到适合您情况的最佳模式
另外,@Yaser提供的答案也是一个好主意——如果你能从一开始就阻止这个异常,那么剩下的就没有意义了
下面是一个你发布的代码示例,我对其进行了一些修改和评论,这可能有助于澄清(还有改进的余地,但这超出了你的问题范围):
public异步任务GetWSObject(string-uriActionString)
{
var returnValue=默认值(T);
尝试
{
使用(var client=new HttpClient())
{
client.BaseAddress=新Uri(Uri);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(
新的MediaTypeWithQualityHeaderValue(“应用程序/json”);
var response=await client.GetAsync(uriActionString);
response.EnsureSuccessStatusCode();
//这不需要尝试捕捉,
//因为不管抛出什么异常
//仍然会被抓住
returnValue=JsonConvert.DeserializeObject(
response.Content.ReadAsStringAsync().Result);
}
}
捕获(例外e)
{
//记录或以其他方式捕获异常详细信息
//如果不需要记录/捕获e变量
returnValue.message1=“问题的用户友好描述”;
}
//catch//也可以这样做
//{
////如果不需要记录/捕获异常,
////那就不用担心过载了
//returnValue.message1=“问题的用户友好描述”;
//}
返回值;
}
在您的catch
块中,记录或以其他方式捕获异常,但如果显示此方法的返回值(从您发布的内容来看似乎是这样),则不要抛出
。然后为您的模型编写一条友好的消息(我假设这就是stringmessage1
属性的用途?如果不是,您可以为它添加一个属性来实现这一目的)。这样,您的用户将看到您所写的内容,这些内容比异常的细节更容易理解
至于做另一个尝试-你可以,但这不是必要的。JsonConvert.DeserializeObject
引发的异常最终将属于Exception
类型,并将被您的catch
捕获。如果要捕获特定的异常类型,请在异常捕获块之前放置另一个catch语句,并以相同的方式处理它
关于如何重新抛出(您当前的代码就是这样做的)的文章和意见到处都是——做一些研究,找到适合您情况的最佳模式
另外,@Yaser提供的答案也是一个好主意——如果你能从一开始就阻止这个异常,那么剩下的就没有意义了
下面是一个你发布的代码示例,我对其进行了一些修改和评论,这可能有助于澄清(还有改进的余地,但这超出了你的问题范围):
public异步任务GetWSObject(string-uriActionString)
{
var returnValue=默认值(T);
尝试
{
使用(var client=new HttpClient())
{
client.BaseAddress=新Uri(Uri);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(
新的MediaTypeWithQualityHeaderValue(“应用程序/json”);
var response=await client.GetAsync(uriActionString);
重新
public async Task<T> GetWSObject<T>(string uriActionString)
{
var returnValue = default(T);
try
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri(uri);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
var response = await client.GetAsync(uriActionString);
response.EnsureSuccessStatusCode();
// this does not need a try catch,
// because whatever exception is thrown here
// will still be caught
returnValue = JsonConvert.DeserializeObject<T>(
response.Content.ReadAsStringAsync().Result);
}
}
catch (Exception e)
{
// log or otherwise capture the exception details
// if you don't need to log/capture the e variable
returnValue.message1 = "A user-friendly description of the problem";
}
//catch // could also do it this way
//{
// // if you don't need to log/capture the exception,
// // then don't bother with the overload
// returnValue.message1 = "A user-friendly description of the problem";
//}
return returnValue;
}
catch (Exception e)
{
if (e.Message.ToString().Contains("No Logs"))
{
Exception e2 = (Exception)Activator.CreateInstance(e.GetType(), "No Logs Found ...", e);
throw e2;
}
throw (e);
}