C# 未捕获C加密异常
我有一个名为DataSet的可序列化类,它有一个静态方法Loadstring filename,string password,返回反序列化的DataSet 这是:C# 未捕获C加密异常,c#,winforms,exception,exception-handling,cryptographicexception,C#,Winforms,Exception,Exception Handling,Cryptographicexception,我有一个名为DataSet的可序列化类,它有一个静态方法Loadstring filename,string password,返回反序列化的DataSet 这是: public static DataSet Load(string filename, string password) { if (!File.Exists(filename)) throw new FileNotFoundException("File not found.", filename); DataS
public static DataSet Load(string filename, string password)
{
if (!File.Exists(filename))
throw new FileNotFoundException("File not found.", filename);
DataSet ds;
ICryptoTransform ct = Encryption.getDecryptor(password, salt, iv);
using (FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read))
{
using (CryptoStream cs = new CryptoStream(fs, ct, CryptoStreamMode.Read))
{
using (GZipStream zs = new GZipStream(cs, CompressionMode.Decompress))
{
try
{
ds = (DataSet)new BinaryFormatter().Deserialize(zs);
return ds;
}
catch
{
throw new ApplicationException("This password cannot be used to decrypt this file. Either the password is incorrect or the file is corrupt");
}
finally
{
zs.Close();
}
}
}
}
}
我这样称呼它:
try
{
dataSet = DataSet.Load(ofd.FileName, ep.Password);
}
catch (ApplicationException ae)
{
MessageBox.Show("Error:\r\n" + ae.Message, "Authorisation Error", MessageBoxButtons.RetryCancel, MessageBoxIcon.Error);
}
使用正确的密码,它可以正常工作。我正在用不正确的密码测试它。预期的结果是弹出一个消息框,指出此密码不能用于解密此文件[…]。相反,我得到的是一个未捕获的异常窗口
如果我在VS中调试,我可以看到发生了未捕获的加密异常。我最初有一个try/catch,有两个捕获,一个用于CryptographicException,另一个用于SerializationException。那没用。我替换了它以捕获异常。最后,我有一个通吃
我不知道为什么,但出于某种原因,它似乎不能抓住这个?我肯定答案很明显,但我就是看不出来
我知道有些异常是不可跟踪的,比如StackoverflowException。我怀疑CryptographicException不是不可修补的。为什么要使用ApplicationException进行捕获?如果捕获到异常,则应捕获异常 根据您的注释,异常似乎正在某个流构造函数中抛出。如果您将try-catch放在更多的代码周围,您将捕获它。ApplicationException不优先的原因是因为CryptographicException是从try/catch块外部抛出的
换句话说,反序列化并不是唯一可以引发加密异常的API。您只需要扩大try/catch/finally块,以包含所有可能引发异常的API调用。完成此操作后,ApplicationException将是Load可以引发的唯一可能的异常,并且您的代码应按预期工作。好,使用catch exception可以捕获异常,但行为仍不符合预期。我正在捕获DataSet.Load中的所有内容,并使用特定消息抛出一个新的ApplicationException。相反,调用函数捕获带有消息填充的加密异常无效,无法删除。-为什么try/catch不在DataSet.Load中捕获加密异常???好的-这很有意义。我更新了我的答案以考虑到这一点。太好了,谢谢。让我吃惊的是,VS在try/catch块内部而不是外部突出显示了这条线,所以它不被捕获的原因是没有道理的。下次我会知道的;