C# 未捕获C加密异常

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

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

  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块内部而不是外部突出显示了这条线,所以它不被捕获的原因是没有道理的。下次我会知道的;