请考虑以下代码段:
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真的应该失败吗?
答案 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);
}