Как правильно обработать исключение - PullRequest
0 голосов
/ 20 апреля 2011

У меня есть служебный класс xmlbuilder, который вызывает несколько методов для создания файла xml

       public XMLBuilder(String searchVal)
        {
            this.searchVal = searchVal;

            try
            {
                getData();
                returnedData = processDataInToOriginalFormat();
                WriteBasicTemplate();
            }
            catch (WebException)
            {
                //If this is thrown then there was an error processing the HTTP request for MSO data.
                //In this case then i should avoid writing the xml for concordance.
                serviceAvailable = false;
                MessageBox.Show("Could not connect to the required Service.");

            }
            catch (NoDataFoundException ndfe)
            {
                //propegate this back up the chain to the calling class
                throw;
            }

processDataInToOriginalFormat(); это метод в классе, который вызывает исключение, если служба недоступна, и я распространил исключение здесь, чтобы иметь дело с ним. Я собирался попытаться установить логический флаг, чтобы указать, нужно ли писать определенный бит XML. Если флаг ложен, не пишите его.

Я забыл, однако, что исключения останавливают поток программы, и теперь я понимаю, что это невозможно, как будто происходит исключение, остальная часть кода не возобновляется. как я могу обойти это? просто добавьте вызов WriteBasicTemplate(); в мое предложение catch?

Спасибо

1 Ответ

0 голосов
/ 20 апреля 2011

Логика вашего кода несколько сбивает с толку, и поскольку неясно, что будет делать serviceAvailable = false, сложно дать подробные советы.Общее правило обработки исключений состоит в том, чтобы ловить (а не перебрасывать) их, если вы действительно знаете, что с ними делать и как решить проблему.Если вы этого не знаете, или программа будет в состоянии, в котором она не сможет продолжить работу, дайте исключению пройти и сбой вашей программы.

В вашем случае я мог бы структурировать код так:1003 *

        try
        {
            returnedData = processDataInToOriginalFormat();
            // put code here which should only be executed in
            // case of no exception
        }
        catch (WebException)
        {
            // do what ever is required to handel the problem
            MessageBox.Show("Could not connect to the required Service.");
        }
        // code which should be executed in every case
        WriteBasicTemplate();

Вы также должны взглянуть на блок «наконец-то».В зависимости от ваших требований, вы должны писатьBasicTemplate в таком блоке.Но я бы, наверное, не сделал этого в вашем случае.Он скорее используется для очистки ресурсов или чего-то в этом роде.

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