Подтвердить что ты не робот

Можно ли перегрузить ключевое слово throw?

Я хочу перегрузить ключевое слово throw, чтобы поймать класс, который наследуется от Exception, и чтобы он делал некоторые записи и другие вещи перед фактическим броском. Это возможно? Или мне нужно использовать регулярную функцию?

Я пробовал:

public class cSilException : Exception
    {
        private string m_strMsg;

        public override void throw(cSilException ex)
        {

        }
...
...
}
4b9b3361

Ответ 1

Что вы хотите сделать, это добавить конструктор в свое исключение и сделать все, что вам нужно сделать в этом конструкторе.

public class cSilException : Exception
{
    //constructor
    public cSilException()
    {
        // do stuff here
    }
}

Ваше понятие "перегрузка ключевого слова throw" было довольно, er, как выразиться, psychedelic.

Конечно, как указывали многие, лучше избегать этого, если вы намерены делать такие вещи, как ведение журнала. Алоис Краус написал еще один ответ с очень хорошим предложением.

Ответ 2

Зарегистрировать событие AppDomain.FirstChanceException. Там вы получите все исключения до того, как они действительно будут выброшены. В обработчике событий вы можете проверить свой exception и выполнить необходимую регистрацию.

Никакой магии и плохой дизайн.

class Program
{
    static void Main(string[] args)
    {
        AppDomain.CurrentDomain.FirstChanceException += CurrentDomain_FirstChanceException;
        DoBadThings();
    }

    private static void DoBadThings()
    {
        DoOneLevelBelow();
    }

    private static void DoOneLevelBelow()
    {

        for(int i=0;i<10;i++)
        {
            try
            {
                if (i == 5)
                {
                    var invalidCast = (string)((object)i);
                }
                else
                {
                    throw new InvalidTimeZoneException();
                }
            }
            catch
            {

            }
        }
    }

    static void CurrentDomain_FirstChanceException(object sender, System.Runtime.ExceptionServices.FirstChanceExceptionEventArgs e)
    {
        if( e.Exception is InvalidCastException)
        {
            LogInvalidCast((InvalidCastException)e.Exception);
        }
    }

    private static void LogInvalidCast(InvalidCastException invalidCastException)
    {
        Console.WriteLine("Got Invalid cast: {0}", invalidCastException);
    }

Это приведет к:

Получил недопустимый листинг: System.InvalidCastException: Объект типа "System.Int32" не может быть преобразован в "System.String". в ThrowTest.Program.DoOneLevelBelow() в d:\Media\Blog\ThrowTest\Program.cs: строка 31.

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

Ответ 3

Я бы не рекомендовал записывать что-либо внутри конструктора исключений, поскольку он нарушает принцип единой ответственности и считается плохим дизайном. Кроме того, тот факт, что было создано исключение, не обязательно означает, что оно было выброшено, и, кроме того, исключения могут быть пойманы и восстановлены - это может привести к неправильным сообщениям журнала.

Вместо этого вы можете использовать обработчик исключений в приложении, который будет обрабатывать исключения в соответствии с вашей предопределенной политикой. Например, вы можете посмотреть Блок обработки исключений Enterprise Library и, в частности, этот раздел.

Ответ 4

Вы не можете перегрузить throw, он является неотъемлемой частью языка (не является членом класса)

Если вы хотите обработать конкретное исключение, вы должны catch это исключение:

try
{
    // your code, which throws some exceptions
}
catch(cSilException csEx)
{
   // handle csEx
   throw;  // rethrow this exception
}
catch(Exception ex)
{
   // handle all other exceptions
}

Этот код выделяет специальное исключение cSilException в другом блоке кода, чем все другие исключения.

Ответ 5

Ищите методы и члены класса Exception. Вы можете определить конструктор для cSilException, как этот

public cSilException(string message)
{
    Message = message;
}

и чем в catch (cSilException ex) do Console.WriteLine(ex.Message);