请尝试在构造函数方法中进行Catch异常处理

本文关键字:Catch 异常处理 方法 构造函数 | 更新日期: 2023-09-27 18:26:53

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

请尝试在构造函数方法中进行Catch异常处理

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

  • 施工成功。该对象是可用的
  • 由于异常中止了构造,因此构造失败

如果您提到的文件对于要运行的对象来说是非常重要的,那么您不应该捕获异常,而只是让它滑到实例化器之外。在这种情况下,"返回一些错误"并使对象保持一半可用性是没有意义的。表单中的事件处理程序应该捕获异常并将其传达给用户。

如果有一个用例中仍然可以返回一个可用的对象,那么应该实现一个静态方法,比如public static MyClass instantiateConditionally(string filename, out bool somethingHappenedAlongTheWay)。这将允许您仍然返回一个实例,并返回出现问题的信息。

即使抛出异常,也需要成功构建对象吗?

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

如果您这样做了,那么我建议在您的对象中实现一个布尔属性HasErrors,如果在构造函数中处理了异常,该属性将返回true。还实现一个方法GetErrors(),它返回任何已处理的异常(方便地存储在实例字段中)或null。这样,如果在创建对象的过程中抛出任何异常,您就可以始终检查您的windows窗体方法,并采取相应的行动。

你的意思是这样的吗?

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来捕获抛出的任何异常,并向用户显示一个消息框。