C # CryptographicException не перехватывается - PullRequest
1 голос
/ 30 мая 2011

У меня есть сериализуемый класс с именем 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-мя уловами, одна для CryptographicException и одна для SerializationException.Это не сработало.Я заменил его, чтобы поймать исключение.Наконец, у меня есть все для ловли.

Я не знаю почему, но почему-то не может это поймать?Я уверен, что ответ очень очевиден, но я просто не вижу его.

Я знаю, что некоторые исключения невозможно отследить, например, StackoverflowException.Я подозреваю, что CryptographicException не является неуловимым.

Ответы [ 2 ]

0 голосов
/ 30 мая 2011

Причина, по которой ваш ApplicationException не "имеет приоритет", заключается в том, что CryptographicException выбрасывается из за пределы вашего try/catch блока.

Другими словами, Deserialize - не единственный API, который может выдавать CryptographicException. Вам просто нужно увеличить свой блок try/catch/finally, чтобы охватить все вызовы API, которые могут вызвать исключение. После того, как вы это сделаете, ApplicationException будет единственным возможным исключением, которое может выдать Load, и ваш код должен работать как положено.

0 голосов
/ 30 мая 2011

Почему вы ловите с ApplicationException?Если вы перехватываете с помощью Exception, вы должны перехватывать исключение.

Учитывая ваш комментарий, похоже, что исключение выдается в одном из конструкторов потока.Если вы попытаетесь поймать больше кода, вы поймете, что все в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...