在构造函数方法中尝试捕获异常处理

时间:2014-10-16 21:06:28

标签: c# .net

我有一个单独的类文件,其中包含构造函数方法以及其他方法,我在Windows窗体中创建了此类的实例。我需要在构造函数方法中进行一些异常处理,如果所需的文件不存在,则用FileNotFoundException捕获它。我唯一的问题是我不知道如何将异常结果传递给Windows窗体,因为我无法传递参数或从构造函数类返回任何数据。

3 个答案:

答案 0 :(得分:3)

你犯了一个概念上的错误。构造函数在生活中只有一个目的:为繁忙的生命周期准备一个类实例。因此,它只能有两种可能的结果:

  • 建设成功。该对象可用。
  • 施工失败,因为施工因例外而中止。

如果您提到的文件至关重要以使对象起作用,则不应该捕获异常,只是让它滑到实例化器外面。在这种情况下,“返回一些错误”并使对象半可用是没有意义的。表单中的事件处理程序应捕获异常并将其传达给用户。

如果存在仍可返回可用对象的用例,则应实现静态方法,如public static MyClass instantiateConditionally(string filename, out bool somethingHappenedAlongTheWay)。这将允许您仍然返回一个实例,并返回出错的地方。

答案 1 :(得分:1)

即使抛出异常,您是否需要成功构造对象?

如果你没有,那么就不要在构造函数中处理异常;在用于创建对象的窗体表单方法中处理它。

如果你这样做,那么我建议在你的对象中实现一个布尔属性HasErrors,如果在构造函数中处理了异常,则返回true。还实现一个方法GetErrors(),它返回任何已处理的异常(方便地存储在实例字段中)或null。这样,如果在创建对象期间抛出任何异常并相应地执行操作,您始终可以检入Windows窗体方法。

答案 2 :(得分:0)

你的意思是这样吗?

public class Form1 : Form
{
    ...


    public void button_Click(...)
    {
        try
        {
            var myclass = new MyClass(@"C:\...some file");
            ...
        }
        catch (FileNotFoundException)
        {
            MessageBox.Show("Can't find the file required");
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }   
    }
}
public class MyClass
{
   public MyClass(string path)
   {
       if(string.IsNullOrEmpty(path))
           throw new ArgumentNullException();

       if(!File.Exists(path))
           throw new FileNotFoundException();
       ...
   }
}

在这里,当用户点击某个按钮时,我会创建一个MyClass实例。

如果没有给出路径或者在指定路径中找不到文件,MyClass的类构造函数会抛出异常。

我使用try catch来捕获抛出的任何异常并向用户显示消息框。