【问题标题】:How to get an Exception from another class c#如何从另一个类c#中获取异常
【发布时间】:2020-03-26 20:35:58
【问题描述】:

我有这些课

//Class 1, ViewModel
    public async System.Threading.Tasks.Task<JObject> ExecuteSystemObject(string parameters)
    {    
        ...
        dynamic j = await ExternalProject.ExecuteSomething<MyModel>(parameters);
        //How i can catch the error from the another class?
        ...
    }

//Class2, Manager
    public async Task<Object> ExecuteSomething<T>() where T : IModel, new()
    {
        ...
        WebResponse response = await ExternalProject.ExecuteRequestAsync(PostRequest);
        ...
    }

//Class 3, from a binding Project 
    public static async Task<WebResponse> ExecuteRequestAsync(WebRequest request)
    {
        try
        {
            return await request.GetResponseAsync();
        }
        catch(WebException e)
        {
            var resp = new StreamReader(e.Response.GetResponseStream()).ReadToEnd();
            dynamic obj = JsonConvert.DeserializeObject(resp);
            //I have the message error here
            var messageFromServer = obj.error.text;
            throw e;
        }
    }

我只能在最后一个类中得到错误,如果我尝试在另一个类中获取 WebException,它将为我返回 null。那么,如何将该错误传递给主类(1º one,ViewModel)?

【问题讨论】:

  • 只需 throw 以保留堆栈跟踪 stackoverflow.com/a/178464/1638261,并且您还应该在要重新捕获异常的操作上设置一个 try catch 块。
  • “我只能在最后一个类中得到错误,如果我尝试在另一个中获取WebException,它将为我返回null。”这很奇怪。请更新您的问题并添加您是如何实现的。仅当您能够在该级别解决异常时才捕获异常。

标签: c# system.net.webexception


【解决方案1】:

当您想要重新抛出异常以便能够保留堆栈跟踪时,请始终使用throw;

public async System.Threading.Tasks.Task<JObject> ExecuteSystemObject(string parameters)
{    
    try 
    {
        dynamic j = await ExternalProject.ExecuteSomething<MyModel>(parameters);
        //How i can catch the error from the another class?
        ...
    }
    catch(Exception e)
    {
        //WebException will be caught here
    }
}

public async Task<Object> ExecuteSomething<T>() where T : IModel, new()
{
    try 
    {
        WebResponse response = await ExternalProject.ExecuteRequestAsync(PostRequest);
    }
    catch(Exception)
    {
        throw;
    }

}

public static async Task<WebResponse> ExecuteRequestAsync(WebRequest request)
{
    try
    {
        //return await request.GetResponseAsync();
        throw new WebException("Test error message");
    }
    catch(WebException e)
    {
        throw;
    }
}

编辑:只是一个经验法则,只有当你有事时才捕获异常。如果您捕获异常只是为了记录它。不要这样做。

【讨论】:

    猜你喜欢
    • 2017-04-07
    • 2013-08-13
    • 1970-01-01
    • 2015-11-13
    • 1970-01-01
    • 2021-08-19
    • 2012-11-04
    • 1970-01-01
    • 2018-10-30
    相关资源
    最近更新 更多