Игнорировать конкретное исключение из броска в C # .NET - PullRequest
0 голосов
/ 04 июля 2018

Можно ли заставить .NET CLR игнорировать определенные исключения? Например, бросок будет просто пропущен, и функция продолжится, как будто ничего не произошло?

Можно ли сделать это без изменения того, откуда выдается код? Программное обеспечение .NET 4.6.1 WinForms.

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

Редактировать: Я помню, как видел в некоторых приложениях WinForms "Возникло исключение, хотите ли вы продолжить или выйти?" Конечно, это то, что мне нужно, если я могу эффективно отклонить исключение и продолжить, как если бы оно никогда не происходило.

Вот пример. Как я могу включить это? enter image description here

Пример: Обратите внимание, что я не пишу код. Я редактирую скомпилированный exe-файл с помощью dnspy, поэтому я не могу легко изменить код, мне приходится редактировать байт-код MSIL вручную.

public void Test(){
  throw new ArgumentException("ignore this");

  MessageBox.Show("Successfully ignored exception");

}

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Очевидно, что вы можете поставить проверку if внутри Catch, чтобы использовать пользовательские функции для определенного исключения -

            try
            {
                // function which you will operate
            }
            catch (Exception ex)
            {
                if (ex is StackOverflowException) //(Type your exception type here)
                {
                    //log this if you want
                }
                else
                {
                    throw; //or handle as per your requirement
                }

            }
0 голосов
/ 04 июля 2018

Вы не можете "игнорировать" исключения так, как вы этого хотите. Однако, если вы выполняете итерации по своим подпрограммам, вы всегда можете просто пропустить одну итерацию, которая вызывает исключение ... например:

while(condition)
{
    try
    {
        // your iteration
    }
    catch (Exception)
    {
        /* don't do a catch, so it will jump back to your while statement and just 
        try the next one */
    }
}

Это должно иметь желаемый эффект, поскольку он будет просто игнорировать итерации, которые в противном случае остановили бы выполнение вашей программы. Надеюсь, это поможет!

EDIT:

Вы можете декомпилировать код и изменить исходный код оттуда. Посмотрите ответ GEOCHET о том, как это сделать:

Как декомпилировать .NET EXE в читаемый исходный код C #?

...