我有一个单独的类文件,其中包含构造函数方法以及其他方法,我在Windows窗体中创建了此类的实例。我需要在构造函数方法中进行一些异常处理,如果所需的文件不存在,则用FileNotFoundException
捕获它。我唯一的问题是我不知道如何将异常结果传递给Windows窗体,因为我无法传递参数或从构造函数类返回任何数据。
答案 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来捕获抛出的任何异常并向用户显示消息框。