首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C# CryptographicException没有被抓到

C# CryptographicException没有被抓到
EN

Stack Overflow用户
提问于 2011-05-30 12:12:01
回答 2查看 1.2K关注 0票数 1

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

这就是它:

代码语言:javascript
复制
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();
        }
      }
    }
  }
}

我这样叫它:

代码语言:javascript
复制
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并不是不可捉摸的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-30 13:40:35

您的ApplicationException没有“优先”的原因是因为CryptographicException是从抛出的,位于您的try/catch块之外。

换句话说,Deserialize并不是唯一可以抛出CryptographicException的API。您只需对try/catch/finally块进行放大,即可包含所有可能抛出异常的应用编程接口调用。完成此操作后,ApplicationException将是Load唯一可能抛出的异常,您的代码应该可以按预期工作。

票数 0
EN

Stack Overflow用户

发布于 2011-05-30 12:25:04

你为什么和ApplicationException在一起?如果你用异常捕获,你应该捕获异常。

根据您的注释,异常看起来是在某个流构造函数中抛出的。如果你把你的try catch放在更多的代码周围,你就会抓住它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6172211

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档