通过自定义异常处理传送其他程序状态信息

时间:2010-12-21 22:13:58

标签: c# exception-handling

简而言之,我正在努力实现这样的目标:

public class AssetParseException : Exception
{
    public AssetParseException()
    {

    }

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

    }
}

理想情况下,这会给我这个功能:

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

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

3 个答案:

答案 0 :(得分:5)

只需添加:

public int AssetID {get; private set;}

到您的AssetParseException课程,并在使用

创建新例外时进行设置
AssetParseException(string message, int assetID):base(message)
{
   AssetID = assetID;
}

我们一直这样做。知道有关异常的其他信息总是很好,为什么不把它放进去,因为你已经麻烦扔掉一个特定类型的异常。

答案 1 :(得分:3)

你绝对可以做到。

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

答案 2 :(得分:0)

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

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