C# 如果一个函数需要返回值,但在函数内部我发现了一个错误并想要中断

C# 如果一个函数需要返回值,但在函数内部我发现了一个错误并想要中断,c#,C#,如果一个函数需要一个返回值,但在函数内部我发现了一个错误并想中断该函数,那么在C#中该如何做呢。。。我的问题是(请跳到评论行): public static async Task<string> GetData(string url, string props = "") { string query = url + "?oauth_token=" + Contract.access_token + props; HttpWebRequ

如果一个函数需要一个返回值,但在函数内部我发现了一个错误并想中断该函数,那么在C#中该如何做呢。。。我的问题是(请跳到评论行):

    public static async Task<string> GetData(string url, string props = "")
    {
        string query = url + "?oauth_token=" + Contract.access_token + props;
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(APIURL + query);
        request.Headers[HttpRequestHeader.IfModifiedSince] = DateTime.Now.ToString();
        request.Method = HttpMethod.Get;

        try
        {
            HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync();

            Debug.WriteLine(response.ContentType);
            System.IO.Stream responseStream = response.GetResponseStream();
            string data;
            using (var reader = new System.IO.StreamReader(responseStream))
            {
                data = reader.ReadToEnd();
            }
            responseStream.Close();

            APIError error = new APIError ();
            try
            {
                using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(data)))
                {
                    DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(APIError ));
                    error = (APIError )serializer.ReadObject(stream);
                }
                MessageBox.Show(error.error_description);
                return null; // I WANT TO BREAK OUT HERE, I really don't want the application to continue its thread... Is there a way of doing this without having to go and code all my controller model calls to try and catch?
            }
            catch (Exception e)
            {
                return data; // The api did not return an error so continue as normal
            }
        }
        catch (Exception ex)
        {
            var we = ex.InnerException as WebException;
            if (we != null)
            {
                var resp = we.Response as HttpWebResponse;
                var code = resp.StatusCode;
                MessageBox.Show("RespCallback Exception raised! Message:{0}" + we.Message);
                Debug.WriteLine("Status:{0}", we.Status);
                return we.Message;
            }
            else
                throw;
        }
    }
公共静态异步任务GetData(字符串url,字符串props=”“)
{
字符串查询=url+“?oauth_token=“+Contract.access_token+props;
HttpWebRequest请求=(HttpWebRequest)WebRequest.Create(APIURL+查询);
request.Headers[HttpRequestHeader.IfModifiedSince]=DateTime.Now.ToString();
request.Method=HttpMethod.Get;
尝试
{
HttpWebResponse=(HttpWebResponse)等待请求。GetResponseAsync();
Debug.WriteLine(response.ContentType);
System.IO.Stream responseStream=response.GetResponseStream();
字符串数据;
使用(var reader=new System.IO.StreamReader(responseStream))
{
data=reader.ReadToEnd();
}
responseStream.Close();
APIRERROR error=新的APIRROR();
尝试
{
使用(MemoryStream stream=new MemoryStream(Encoding.UTF8.GetBytes(data)))
{
DataContractJsonSerializer serializer=新的DataContractJsonSerializer(typeof(APIRROR));
错误=(APIRERROR)序列化程序.ReadObject(流);
}
MessageBox.Show(error.error\u说明);
return null;//我想在这里突破,我真的不想让应用程序继续它的线程…有没有一种方法可以做到这一点,而不必编写所有控制器模型调用的代码来尝试捕获?
}
捕获(例外e)
{
return data;//api没有返回错误,因此继续正常操作
}
}
捕获(例外情况除外)
{
var we=ex.InnerException作为WebException;
如果(we!=null)
{
var resp=作为HttpWebResponse的we.Response;
var代码=相应的状态代码;
Show(“引发了RespCallback异常!消息:{0}”+we.Message);
WriteLine(“状态:{0}”,we.Status);
回复我们。留言;
}
其他的
投掷;
}
}

不要捕获异常

让调用方捕获异常-或者,可以选择捕获异常并将其包装在您自己的
exception
类型中


你把所有的鸡蛋都放在一个篮子里,把它抓得这么远,你就没有多少回旋的余地了。让它冒泡起来可以让你有更多的选择来处理它。

在catch()语句的末尾放置throw()。然后它将处理它,但再次抛出相同的异常以冒泡。

您的调用代码应该正在处理异常。如果您的执行无法继续,那么让异常冒泡出来,并在这里删除方法中一些不必要的try/catch

依我看,你把异常处理放错地方了。如果您想中止执行,那么您应该让异常冒泡(或将其包装成新的异常),并在顶层处理它,在顶层向用户发送消息和/或写入日志是有意义的。那么,如果出现错误,您希望函数具体做些什么(您所说的中断函数是什么意思)?只有两个选项:返回值或抛出异常。我的意思是,如果streamreader确实成功创建了一个APIRROR对象,则向用户抛出一条消息,显示api的错误。。。然后引导他进入登录页面。(只有当用户达到api的使用限制时才会抛出错误…)Ok。你想在这个函数中处理所有这些(显示错误并重定向到登录页面)吗?基本上,GetData是所有API调用的路由,因为我在整个应用程序中调用这个GetData,所以我不想尝试捕捉每个调用。。。不如在这里抓。。。因此,如果它确实返回了一个错误,它将取消任何当前任务并重定向到我的登录页面。我真的很想这样做,但这意味着在我的应用程序中,我将不得不更改每个调用代码的存储库以捕获错误。。。虽然我想如果没有其他选择,我可以花几个小时检查控制器,但这完全取决于你想用它做什么。如果你只是想把它记录下来。。然后连接
AppDomain.UnhandledException
事件并记录它。如果您需要执行特定的任务,也许您仍然可以在全局“错误发生”事件中执行该任务。这可能会变得混乱-但这是一个选项(因为我实际上不知道您的用例)。。当我有更多的时间时,我可能会去试着抓住打电话的人,因为现在应该可以了。谢谢,曼诺,没问题。您的另一个选项是某种Fascade,用于调用和捕获异常。然后,所有调用方调用one-Fascade,它为它们处理异常。这里的想法是,它消除了在代码核心中处理它的需要,并将它委托给更高的部分。