我需要使用自定义系统更改特定的系统异常消息。
捕获异常并在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;
}
或者有更好的方法来实现这一目标。
答案 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);
}