请尝试在构造函数方法中进行Catch异常处理
本文关键字:Catch 异常处理 方法 构造函数 | 更新日期: 2023-09-27 18:26:53
我有一个单独的类文件,其中包含一个构造函数方法和其他方法,我在Windows窗体中创建了这个类的实例。我需要在构造函数方法中进行一些异常处理,如果所需文件不存在,则用FileNotFoundException
捕获它。我唯一的问题是,我不知道如何将异常的结果传递到Windows窗体,因为我不能从构造函数类传递参数或返回任何数据。
您犯了一个概念错误。构造函数在生命中只有一个目的:为繁忙的生命周期准备一个类实例。因此,它只能有两种可能的结果:
- 施工成功。该对象是可用的
- 由于异常中止了构造,因此构造失败
如果您提到的文件对于要运行的对象来说是非常重要的,那么您不应该捕获异常,而只是让它滑到实例化器之外。在这种情况下,"返回一些错误"并使对象保持一半可用性是没有意义的。表单中的事件处理程序应该捕获异常并将其传达给用户。
如果有一个用例中仍然可以返回一个可用的对象,那么应该实现一个静态方法,比如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来捕获抛出的任何异常,并向用户显示一个消息框。