c# - 修改现有程序以更好地处理异常

标签 c# exception try-catch

我正在开发一个现有的 C# 程序,该程序查询和更改程序和运行该程序的计算机之外的各种资源。该程序适用于大多数计算机,但偶尔会在随机计算机上随机失败。当发生这种情况时,除了用户告诉我们他们可能已经清除或可能未清除的屏幕上抛出的异常之外,我们没有关于原因的反馈。即使他们为我们把它留在屏幕上,它也几乎没有提供给我们有用的信息。从那以后,我修改了程序以记录特定事件并将信息收集到一个文本文件中,我可以用它来估计程序停止的位置。这至少是一个开始,但是通过阅读 stackoverflow.com 以及其他论坛上的许多线程,我知道该程序至少需要尝试处理在查询和修改 LDAP、DS、DNS 时可能出现的特定异常、SQL等。

目前只有大的 try block 围绕着所有待办代码,每个代码末尾只有一个 catch block 。

private void method_name()
{
    try
    {
       //many lines of to do code calling many other methods
    }
    catch (exception ex)
    {
        MessageBox.Show("An Error has occurred in method_name() :" + ex.Message);
    }

我的第一个想法是在较大的 try block 中嵌套更具体的 try/catch block ,但我一直遇到变量在不同上下文中变得无法访问的问题。例如

try
{
   LdapConnection ldapConn = new LdapConnection();
   ldapConn.Connect(details of connection);
   ldapConn.Bind(details of bind statement);
   LdapSearchQueue queue = ldapConn.Search(search criteria and such);
   LdapMessage message;
}
catch (somesortofexception ex)
{
   //do something sensible about it
}

while ((message = queue.getResponse()) != null)
{
   //do things with message
}
ldapConn.Disconnect();

问题是在 try block 之外无法访问消息和队列。这只是我尝试使用的“//许多行代码调用许多其他方法”完成的事情的一个例子。

所以这是我的问题:

在上面的例子中尝试扩大 try block 以包含 while 循环和 ldap disconnect 还是只留下大的 try 循环,列出在此期间发生的事情并创建许多 catch block 会更好吗最后捕捉特定的异常?根据我在该站点上阅读的内容,我觉得围绕特定代码放置较小的 try block 是可行的方法。

我是否应该像我一直尝试实现的那样使用较小的 try block ,只使用一个 catch block 来捕获该小代码片段中引发的任何异常并将其记录到我的日志文件中,或者我应该尝试捕捉特定的异常?除了将它们记录到文件之外,我真的没有什么不同可以处理这些异常。

我需要抛出异常吗?除了用简单的英语表示出现问题并联系 IT 之外,我真的不希望向用户冒出任何信息。目前没有一个 catch block 抛出任何东西。

最佳答案

关于分解异常,我总是将连接代码与查询代码分开。

所以这会变成:

LdapConnection ldapConn = new LdapConnection();
try
{
   ldapConn.Connect(details of connection);
   ldapConn.Bind(details of bind statement);
}
catch (somesortofexception ex)
{
   //Log, send error message..
   ldapConn = null;
}

if (ldapConn != null)
{
    try
    {
         //Do what you need with your connection
    }
    catch (Exception ex)
    {
         //Log, Error....
    }
    finally
    {
        //Disconnect your ldap here
    }
}

理想情况下,我也会将所有连接代码和搜索代码放在不同的方法中, 所以你会有一些更好的堆栈跟踪。

关于错误消息,我也会使用一些通用消息并将异常细节记录到某种文件中 ( http://logging.apache.org/log4net/ ) 对于格式良好的日志文件来说非常好。

关于c# - 修改现有程序以更好地处理异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12517096/

相关文章:

java - arraylist 迭代器 equals 返回 java.util.NoSuchElementException

android - 我在 Android 的 Proguard 配置中缺少什么?

python - 尝试/排除某种类型的所有 Python 错误

c# - .NET/C# - 反射 - 曾经使用过的 System.IO.File

c# - 如果您知道任务已完成,可以在异步方法中调用 task.Result 吗?

c# - 获取数据库列表取决于所选服务器

c# - Paypal 整合到网站

java - try catch block 后引发异常

java - 在 Java 中,try、catch 和 finally 中的 return 是如何工作的?

Java,1 个 try block ,2 个不同的构造函数抛出相同的异常,分开?