异常/类需要解释

时间:2009-01-10 01:13:45

标签: c# design-patterns

请考虑以下代码段:

  using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;


namespace ForumLogins {
    public class VBULLETIN {

        HttpWebRequest request;


        public void ForumLogins(string url) {          
            request = (HttpWebRequest)WebRequest.Create(url);
        }
    }
}

根据MSDN,“Create”方法可以返回4个异常。现在我无法解除这些例外......因为否则该类不会起作用。但是我该怎么办?我还应该将它包装在try / catch块中吗?并在捕获“抛出一个新的例外”..或让让这个类的人处理异常?

Cuz这是一个构造函数..我猜构造函数arnt真的应该失败吗?

3 个答案:

答案 0 :(得分:3)

如果构造函数失败,那么您应该让实现该类的人处理错误。请务必记录它可能失败的事实,以便他们知道尝试/捕获。

相关说明,构造函数永远不会失败。 =)

相反,将可能失败的逻辑放入“Go()”方法中。这样你就可以实例化一个真正的类,但是在代码的各个部分放置一个try / catch,并且稍后仍然会引用try-catch块之外的对象。只是我的$ .02。

答案 1 :(得分:1)

您所做的工作取决于代码的作用。如果这是您要分享的库,我建议您包装所有异常并重新为图书馆重新抛出有意义的异常。这将有助于您实现实现封装。

例如

try
{
   if (string.isNullOrEmpty(url))
   {
      //This will stop the arugment null exception and you can throw a meaningful message
   } 
    request = (HttpWebRequest)WebRequest.Create(url);
}
catch(SecurityException sex)
{
   //Can't handle this but maybee you can provide more information about how to configure security here...

     throw new YourCustomerException(msg,sex); //It's good practice to put the current exception in the inner exception
}

如果您没有构建组件而这是您的应用程序,那么我建议您沿着堆栈的某处捕获错误,并记录它。

此外,这不是您在WebRequest上调用Factory方法的构造函数,名为Create。

答案 2 :(得分:1)

在我看来,这段代码并不是您将要使用的确切代码,所以我试图根据您尝试提出的问题来回答您的问题。

我建议在可能的情况下处理异常。如果那是不可能的,我认为在你的情况下,最好的方法是将WebRequest.Create异常包装为InnerException并重新抛出它。这样可以保留抽象,同时在必要时仍可提供更多详细信息。可能与此相符:

try{
    request = (HttpWebRequest)WebRequest.Create(url);
}
catch(Exception e) {
    throw new ForumLoginException(e);
}