C#按消息捕获异常

时间:2015-07-12 08:28:24

标签: c# exception-handling

我需要使用自定义系统更改特定的系统异常消息。

捕获异常并在catch块内部检查系统异常消息是否与特定字符串匹配是不是不好的做法,如果是,请抛出我的自定义异常?

try
{
    ...
}
catch (System.Security.Cryptography.CryptographicException ex)
{
    if (ex.Message.Equals("The specified network password is not correct.\r\n", StringComparison.InvariantCultureIgnoreCase))
        throw new Exception("Wrong Password");
    else
        throw ex;
}

或者有更好的方法来实现这一目标。

2 个答案:

答案 0 :(得分:6)

使用catch语句抛出异常没有任何内在错误。但是要记住以下几点:

使用“throw”而不是“throw ex”重新抛出异常,否则会松开堆栈跟踪。

来自Creating and Throwing Exceptions

  

不要抛出System.Exception,System.SystemException,   System.NullReferenceException或System.IndexOutOfRangeException   故意来自您自己的源代码。

如果CrytographicException真的不适合您,您可以创建一个特定的异常类来表示无效的密码:

try
{
    ...
}
catch (System.Security.Cryptography.CryptographicException ex)
{
    if (ex.Message.Equals("The specified network password is not correct.\r\n",
            StringComparison.InvariantCultureIgnoreCase))
        throw new InvalidPasswordException("Wrong Password", ex);
    else
        throw;
}

请注意原始异常如何在新的InvalidPasswordException中保留。

答案 1 :(得分:0)

为了在检查消息时避免展开堆栈,您可以使用用户过滤的异常处理程序 - https://docs.microsoft.com/en-us/dotnet/standard/exceptions/using-user-filtered-exception-handlers。这将维护未过滤异常的堆栈跟踪。

try
{
    // ...
}
catch (System.Security.Cryptography.CryptographicException ex) when (ex.Message.Equals("The specified network password is not correct.\r\n", 
StringComparison.InvariantCultureIgnoreCase))
{
    throw new InvalidPasswordException("Wrong Password", ex);
}