2010-12-21 116 views
1

总之输送额外的程序状态的信息,我想实现这样的事情:通过自定义异常处理

public class AssetParseException : Exception 
{ 
    public AssetParseException() 
    { 

    } 

    public AssetParseException(string message/*, int assetID*/): base(message) 
    { 

    } 
} 

理想的应该给我这个功能:

catch (AssetParseException exception) 
{ 
    int idThatCausedIssue = exception.assetID; 
} 

额外的信息,我想要的是整数参数。我想在更高级别捕获AssetParseExceptions,并知道哪个资产抛出异常。这可能吗?我是否需要将所有这些信息都推送到消息中,然后在更高级别解析出来?

回答

5

只需添加:

public int AssetID {get; private set;}

AssetParseException类,并设置它,当你创建一个使用

AssetParseException(string message, int assetID):base(message) 
{ 
    AssetID = assetID; 
} 

我们做这一切的时候一个新的异常。了解有关异常的更多信息总是很好的,为什么不把它放入,因为你已经费了很大力气去抛出特定类型的异常。

+0

啊,我真是无聊。好的,是的。这使它工作。 – 2010-12-21 22:20:11

3

你绝对可以做到这一点。

你对如何做到这一点感到困惑吗?或者只是想知道这是否是好的做法?在我看来,这是一个好习惯。

0

自定义异常通常很好,特别是在您提供有关错误的更多特定信息的情况下。有些事情要记住:

  • 如果引发此异常的代码将被其他项目引用,请确保将该类公开,以便它可以在其他地方的catch语句中使用。
  • 您应该记录一下这样的事实,即方法可能会抛出此自定义异常;您可以使用xml-doc注释和'exception'标记来指定此方法可能抛出的异常类型。
  • 例外情况经常(但并非总是)键入以用于特定类型的错误。如果解析可能以您希望单独处理的不同方式失败,请考虑进一步子类化,例如AssetParseNullValueException,AssetParseEncodingException等,而不是将此信息合并为更多字段或消息数据。
  • 除了以前的观点,关于异常的消息通常是显示给用户的。创建主要用代码解析出来的消息不是它们的目的。