1

我有一个名为 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);
}

使用正确的密码,它可以正常工作。我正在使用错误的密码对其进行测试。预期的结果是消息框弹出“此密码不能用于解密此文件 [...]”。相反,我得到了一个未捕获的异常窗口。

如果我在 VS 中调试,我可以看到发生了未捕获的 CryptographicException。我最初有一个带有 2 个捕获的 try/catch,一个用于 CryptographicException,一个用于 SerializationException。那没有用。我将其替换为捕获异常。最后,我有一个全部。

我不知道为什么,但由于某种原因,它似乎无法捕捉到这个?我确信答案很明显,但我就是看不到。

我知道有些异常是无法捕获的,例如 StackoverflowException。我怀疑 CryptographicException 不是无法捕获的。

4

2 回答 2

0

你为什么要赶上 ApplicationException?如果您使用异常捕获,则应该捕获异常。

鉴于您的评论,看起来异常正在其中一个流构造函数中引发。如果你把你的 try catch 放在更多的代码上,你会抓住它的。

于 2011-05-30T04:25:03.720 回答
0

ApplicationException没有“优先”的原因是因为它是从你的街区CryptographicException抛出的。try/catch

换句话说,Deserialize不是唯一可以抛出CryptographicException. 您只需扩大try/catch/finally块以包含所有可能引发异常的 API 调用。完成此操作后,ApplicationException将是唯一可能抛出的异常,Load并且您的代码应该按预期工作。

于 2011-05-30T05:40:34.980 回答