C#从异常句柄返回一些东西

时间:2009-04-29 02:15:54

标签: c# exception-handling

我的类中有以下代码。此类的目的是从Web服务器获取余额。万一以获得平衡出现问题。我会处理一个例外。但是,这一切都很容易。但是我想知道在我的捕获声明中我会返回什么。

我看到的大部分示例都是使用以下方式写入控制台:

Console.WriteLine(ex.Message);

这一切都很好。但在实际应用中,大多数开发人员做了什么?

 //Download only when the webclient is not busy.
        if (!wc.IsBusy)
        { 
            // Sleep for 1/2 second to give the server time to update the balance.
            System.Threading.Thread.Sleep(500);

            try
            {
                // Download the current balance.
                wc.DownloadStringAsync(new Uri(strURL));
            }
            catch (WebException ex)
            {
                Console.Write("GetBalance(): " + ex.Message);
            }
        }
        else
        {
            Console.Write("Busy please try again");
        }

此刻我的功能无效。而且我只是想知道如果webclient忙的话我还能再回来什么?

非常感谢任何建议,

6 个答案:

答案 0 :(得分:14)

如果无法处理异常,请不要捕获异常。如果只返回一些值,则调用方法必须检查该值是实际结果还是仅指示异常。现在这种方法必须决定做什么和返回。并且调用此方法的方法。方法......

因此,只需让异常在堆栈中冒泡并将其捕获到可以处理它的位置。也许直接在用户界面下方,然后显示一个消息框,询问用户是否要重试或显示如何解决问题的信息。如果您没有用户界面,请将其捕获到可以解决问题并重试的位置。如果这是一个临时问题,请在合理的级别重试整个任务,直到调用成功。

如果要记录某些内容,请使用以下模式记录异常并重新抛出异常。

try
{
   DoStuff();
}
catch (Exception exception)
{
   Log(exception.ToString());

   throw;
}

请注意,它是throw;而不是throw exception;。如果执行稍后操作,则会丢失原始堆栈跟踪。如果您可以推断出有关异常原因的更多详细信息,则应将捕获的异常包含在一个更有意义的异常中,并提供其他信息。

try
{
   DoStuff();
}
catch (SpecificMeaninglessException exception)
{
   Log(exception.ToString());

   throw new MeaningfulException("Details about the error.", exception);
}
catch (Exception exception)
{
   Log(exception.ToString());

   throw;
}

答案 1 :(得分:3)

你应该使用ex.ToString()方法

  

Exception.Message   包含异常的简单描述(例如“对象引用未设置...”)。

     

Exception.ToString()   包含异常的描述以及完整的堆栈跟踪。

Exception Handling Best Practices in .NET

答案 2 :(得分:1)

如果客户端正忙,您可以重新运行该方法,但在重试前等待一段时间? x重试后可能出现故障。

如果您希望继续并简单地记录问题,您的catch语句可以将异常记录到基于文件的日志,事件查看器,提交到数据库,发出警报(电子邮件,短信等),如果它是必要的。

答案 3 :(得分:1)

取决于异常的严重性。

我建议调查The Exception Block from Patterns & Practices

答案 4 :(得分:1)

如果您只对查看异常感兴趣,那么您应该抛出异常,以便有人计划处理它仍然可以获得它。

答案 5 :(得分:1)

你当然不想掩盖未处理的异常。让那个泡沫通过堆栈。但是,如果你问的是,如果网络客户端只是忙碌会返回什么,那么怎么样 在尝试再次下载余额之前,返回函数调用者应该等待的随机间隔或一些有意义的间隔?随机数可以分配负载或以其他方式缓解冲突问题。可以根据服务器的当前状态发回更有意义的间隔。