创建自己的例外

时间:2010-10-24 23:58:45

标签: c# .net vb.net error-handling

我想建立一些已知错误的建议。假设我有一个Windows表单,需要在对象中设置图像的源路径。必须是:

  • 有效路径
  • 图片
  • PNG
  • 32 x 32尺寸
  • 无透明度

关于捕获错误的事情是我希望该类尽可能地处理错误,而不是Windows窗体。

所以让我说我有:

Public Class MyImage
    Public Property SourcePath As String
End Class

Sub TestImage()
    Dim imgPath As New MyImage
    Try
        imgPath.SourcePath = "C:\My Documents\image001.png".
    Catch ex As Exception
 MsgBox(ex)
    End Try
End Sub

SourcePath应该是指向有效图像文件的字符串路径,即png,即32x32且没有透明度。如果它不是那些中的一个或多个,我只是希望ex报告那里有什么错误(例如“图像不是32x32”或“图像包含透明度,这不应该。它也不是32x32。)。如何为上面的属性SourcePath创建自己的例外?

除此之外,假设我上面有相同的要求,但是我需要48x48大小而不是32x32大小的SourcePath上的图像。有没有办法为此定制?

提前谢谢

3 个答案:

答案 0 :(得分:9)

使用类似的东西:

public class InvalidImageException : Exception
{
    public InvalidImageException() { }
    public InvalidImageException(string message)
        : base(message) { }
    public InvalidImageException(string message, Exception innerException)
        : base(message, innerException) { }
    public InvalidImageException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context)
        : base(info, context) { }
    public InvalidImageException(string message, MyImage image)
        : base(message) 
    {
        this.Image = image;
    }
    public MyImage Image { get; set; }
}

在设置SourcePath属性时,您可能不应该抛出异常。可能在构造函数中具有该逻辑(接受字符串,sourcepath到构造函数并抛出验证)。无论哪种方式,代码看起来都像这样......

public class MyImage
{
    public MyImage(string sourcePath)
    {
        this.SourcePath = sourcePath;
        //This is where you could possibly do the tests. some examples of how you would do them are given below
        //You could move these validations into the SourcePath property, it all depends on the usage of the class
        if(this.height != 32)
            throw new InvalidImageException("Height is not valid", this);
        if(this.Width != 32)
            throw new InvalidImageException("Width is not valid",this);
        //etc etc
    }
    public string SourcePath { get; private set; }
}

然后你的代码看起来像这样......

try
{
    imgPath = new MyImage("C:\My Documents\image001.png");
}
catch(InvalidImageException invalidImage)
{
    MsgBox.Show(invalidImage.Message);
}
catch(Exception ex)
{
    //Handle true failures such as file not found, permission denied, invalid format etc
}

答案 1 :(得分:2)

在SourcePath属性的setter中,您希望进行有效性检查,并根据需要抛出异常。

您可以抛出内置异常类型并将字符串传递给它以提供特定错误,也可以创建自己的System.Exception派生的异常类。

答案 2 :(得分:2)

有很多方法可以选择这样做,但是我可能会采取以下措施:

void TestImage()
{
    MyImage image = new MyImage();
    try
    {
        image.Load("@C:\My Documents\image001.png");
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

image.Load()看起来有点像:

void Load(string path)
{
    if (!File.Exists(path))
    {
        throw new FileNotFoundException("File '" + path + "' does not exist.");
    }
    if (/* image is wrong size */)
    {
        throw new InvalidImageSizeException("File " + path + " is not in the correct size - expected 32x32 pixels");
    }
    // etc...
}

有些人会争辩说你应该拥有自己的自定义异常类型 - 如果你愿意,你可以这样做但我只是在标准异常类型没有真正涵盖异常情况时才会烦恼(例如InvalidImageSizeException