C#CryptographicException未被捕获

时间:2011-05-30 04:12:01

标签: c# winforms exception exception-handling cryptographicexception

我有一个名为DataSet的可序列化类,它有一个静态方法Load(string filename, string password),它返回反序列化的DataSet。

这是:

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。我最初有一个带有2个catch的try / catch,一个用于CryptographicException,另一个用于SerializationException。那没用。我替换它以捕获异常。最后,我抓住了所有人。

我不知道为什么,但由于某种原因它似乎无法抓住这个?我确定答案非常明显,但我看不出来。

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

2 个答案:

答案 0 :(得分:0)

为什么要捕获ApplicationException?如果你遇到Exception,你应该捕获异常。

鉴于您的评论,看起来在其中一个流构造函数中抛出异常。如果您将try catch放在更多的代码周围,那么您将会抓住它。

答案 1 :(得分:0)

ApplicationException没有“优先”的原因是CryptographicException被{strong> <{1}}阻止。

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