Как выбросить и поймать исключение - PullRequest
0 голосов
/ 10 июля 2020

Я полностью согласен с тем, что это, по сути, повторение вопроса Обнаружение пользовательского исключения в c# Этот вопрос закрыт, поэтому я надеюсь перефразировать его, поскольку у меня такая же проблема.

У меня есть класс, который можно резюмировать таким образом ..

[Serializable()]
public class DataFile : ISerializable
{
    public DataFile()
    {
        // Data structures
    }
    
    public DataFile(SerializationInfo info, StreamingContext ctxt) : this()
    {
        if(true)
        {
            throw new VersionNotFoundException();
        }
    
        // Load data
    }
    
    public void GetObjectData(SerializationInfo info, StreamingContext ctxt)
    {
        // Save data 
    }
}

В моей MainForm у меня есть метод, который содержит код, эквивалентный ..

private  DataFile Data;
private string CurrentFile = "C:\myfile.xyz";

private void LoadData()
{
    try
    {
        using (Stream stream = File.Open(CurrentFile, FileMode.Open))
            Data = (DataFile)new BinaryFormatter().Deserialize(stream);
    }
    catch (VersionNotFoundException e)
    {
         // never gets here
    }
    catch (Exception e)
    {
        // VersionNotFoundException gets caught here as an inner exception
    }
}

Мой вопрос ( s)

Почему VersionNotFoundException не попадает в раздел «catch (VersionNotFoundException e)» (разве я не добавил его в верхнюю часть стека исключений)? Что я делаю не так и как это исправить? Почему / как я делаю «внутреннее» исключение и как его остановить?

1 Ответ

3 голосов
/ 10 июля 2020

Я чесал голову этим и полностью пропустил комментарий.

// VersionNotFoundException gets caught here as an inner exception

Вы не можете поймать внутренние исключения, подобные этому, однако вы можете использовать when в C # 6 или новее

try
{
   
}
catch (Exception e) when (e.InnerException is VersionNotFoundException e2) 
{
   Console.WriteLine(e2.Message);
}
catch (Exception e)
{
  
}

Демо здесь

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