Как автоматически повторно поднять исключения - PullRequest
3 голосов
/ 09 апреля 2010

Если вы поместите вызов на HttpResponse.End в блоке try catch, ThreadAbortException будет автоматически повторно вызван. Я предполагаю, что это так, даже если вы включаете блок try catch в блок try catch.

Как я могу сделать то же самое? У меня нет реального приложения для этого.

namespace Program
{
    class ReJoice
    {
        public void End() //This does not automatically re-raise the exception if caught.  
        {
            throw new Exception();
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                ReJoice x = new ReJoice();
                x.End();
            }
            catch (Exception e) {}
        }
    }
}

Ответы [ 3 ]

7 голосов
/ 09 апреля 2010

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

ThreadAbortException - это специальное исключение, которое может быть перехвачено, но оно будет автоматически вызвано снова в конце блока catch.

4 голосов
/ 09 апреля 2010

Это так же просто, как использование простого оператора throw.

throw;

в соответствующем блоке улова. Обратите внимание, что это выгодно по сравнению с throw e;, потому что сохраняет стек вызовов в точке исключения.

Конечно, это не автоматизировано в том смысле, в каком вы хотите, но, к сожалению, это невозможно. Это в значительной степени лучшее решение, которое вы получите, и все же, я думаю, довольно простое. ThreadAbortException особенный в CLR, потому что он почти присущ управлению потоками.

В случае вашей программы у вас будет что-то вроде:

namespace Program
{
    class ReJoice
    {
        public void End()
        {
            throw new Exception();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                ReJoice x = new ReJoice();
                x.End();
            }
            catch (Exception e) 
            {
                throw;
            }
        }
    }
}
1 голос
/ 09 апреля 2010

Вы имеете в виду, как это?

namespace Program
{
    class ReJoice
    {
        public void End() //This does not automatically re-raise the exception if caught.  
        {
            throw new Exception();
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                ReJoice x = new ReJoice();
                x.End();
            }
            catch (Exception e) {
               throw e;
            }
        }
    }
}

Редактировать: оно не вызывает новое исключение, потому что значение «catch» - обрабатывать исключение. Вам, как вызывающей стороне x.End (), решать, что вы хотите делать в случае возникновения исключения. Поймав исключение и ничего не делая, вы говорите, что хотите игнорировать исключение. Внутри блока catch вы можете отобразить окно сообщения, или зарегистрировать ошибку, полностью убить приложение или повторно выдать ошибку с дополнительной информацией, добавив исключение:

throw new Exception("New message", e);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...