У меня есть сериализуемый класс с именем 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 не является неуловимым.