【发布时间】:2018-03-18 13:04:43
【问题描述】:
我有一些密码学代码,像这样(缩写)
Public Class Encryption
Public Sub DoEncryption()
[...]
Try
cryptstream.CopyTo(msVerifyOut)
Catch ex As System.Security.Cryptography.CryptographicException
Throw New System.Security.Cryptography.CryptographicException("Not a valid keyfile or password incorrect", ex)
End Try
[...]
End Sub
End Class
Public Class MainClass
Public Sub UseEncryption
[...]
Dim Encrypter As New Encryption
Try
Encrypter.DoEncryption()
Catch ex As System.Security.Cryptography.CryptographicException
MessageBox.Show("Encryption failed: " & vbCrLf & ex.Message)
End Try
[...]
End Sub
End Class
所以cryptstream.CopyTo(msVerifyOut) 行可能会抛出一个CryptographicException,它会被捕获并重新抛出一个新的CryptographicException(有或没有InnerException 的原始异常,在这里无关紧要)并带有自定义消息。
我希望消息框显示:Encryption failed: Not a valid keyfile or password incorrect。但事实并非如此。它改为Encryption failed: Original exception message。
我试图重新创建这样的:
Private Function Test() As Object
Try
Dim tst1 = Test1()
Return tst1
Catch ex As CryptographicException
Throw New CryptographicException("From Test", ex)
End Try
End Function
Private Function Test1() As Object
Throw New CryptographicException("From Test1")
End Function
Private Sub PerformTest()
Try
Dim tst = Test()
Catch ex As CryptographicException
MessageBox.Show(ex.Message)
End Try
End Sub
但这里的消息框输出了我所期望的:From Test
所以cryptstream.CopyTo(msVerifyOut)抛出异常的方式肯定和验证版有一些不同,但是我不知道有什么区别。
作为参考,抛出的异常是:Padding is invalid and cannot be removed。我不是在问为什么抛出异常,而是为什么我不能用不同的消息正确地重新抛出它。
【问题讨论】:
-
还有其他代码用来显示消息框吗?也许那是使用 GetBaseException()。
-
@N0Alias 不,这是我自己的一个小程序,仅此而已。当我打破
cryptstream.CopyTo(msVerifyOut)并单步执行时,它只是跳入Catch,抛出新异常,完成流的Using块,然后进入包含消息框的外部Catch块。稍后我会考虑将其放在 Github 上以获取完整代码(现在不能)。