我有一个名为DataSet的可序列化类,它有一个返回反序列化DataSet的静态方法Load(string filename, string password)。
这就是它:
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);
}有了正确的密码,它就能正常工作。我正在用不正确的密码测试它。预期的结果是弹出一个MessageBox,说明“此密码无法用于解密此文件...”。相反,发生的情况是我得到了一个未捕获的异常窗口。
如果我在VS中调试,我可以看到发生了一个未捕获的CryptographicException。我最初有一个带有两个catch的try/catch,一个用于CryptographicException,一个用于SerializationException。这不管用。我替换了它以捕获异常。最后,我有了一个包罗万象的方法。
我不知道为什么,但出于某种原因,它似乎不能捕捉到这个?我相信答案是很明显的,但我就是看不出来。
我知道有些例外是无法捕捉的,比如StackoverflowException。我怀疑CryptographicException并不是不可捉摸的。
发布于 2011-05-30 13:40:35
您的ApplicationException没有“优先”的原因是因为CryptographicException是从抛出的,位于您的try/catch块之外。
换句话说,Deserialize并不是唯一可以抛出CryptographicException的API。您只需对try/catch/finally块进行放大,即可包含所有可能抛出异常的应用编程接口调用。完成此操作后,ApplicationException将是Load唯一可能抛出的异常,您的代码应该可以按预期工作。
发布于 2011-05-30 12:25:04
你为什么和ApplicationException在一起?如果你用异常捕获,你应该捕获异常。
根据您的注释,异常看起来是在某个流构造函数中抛出的。如果你把你的try catch放在更多的代码周围,你就会抓住它。
https://stackoverflow.com/questions/6172211
复制相似问题