Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#我应该在try-catch中使用try-catch来处理响应吗?这是个坏主意吗?_C#_.net_Model_Try Catch - Fatal编程技术网

C#我应该在try-catch中使用try-catch来处理响应吗?这是个坏主意吗?

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";

我的代码处理一些restapi(GET方法)。此GET方法返回如下响应:

{"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);
        }