Выборочное предотвращение остановки отладчика при исключениях 1-го случая
Я знаю, что могу запретить отладчику Visual Studio останавливаться на определенных исключениях, когда их бросают (через диалог "Исключения" Ctrl-Alt-E). Но что, если хотите контролировать это из кода, для некоторых конкретных мест, а не на основе "все или ничего"? Например:
try
{
SomeMethod(token);
}
catch (OperationCancelledException)
{
return false;
}
// ...
void SomeMethod(CancellationToken token)
{
// ...
// I don't want the debugger to stop on the following line
#pragma ignore(OperationCancelledException, true)
token.ThrowIfCancellationRequested();
#pragma ignore(OperationCancelledException, false)
}
Я использую гипотетический #pragma ignore
, чтобы проиллюстрировать, что я имею в виду, но что-то вроде этого действительно существует?
UPDATE, чтобы ответить на вопрос "Нечеткое, что вы просите". Попробуйте этот код в отладчике: https://dotnetfiddle.net/npMk6r. Убедитесь, что все исключения включены в диалоговом окне Ctrl-Alt-E. Отладчик будет останавливаться на строке throw new OperationCanceledException("cancelled1")
на каждой итерации цикла. Я не хочу, чтобы это случалось так, как это раздражало. Тем не менее, я хочу, чтобы он остановился на последнем броске вне цикла, throw new OperationCanceledException("cancelled2")
(или где-нибудь еще, если на то пошло).
Ответы
Ответ 1
Это может быть не совсем то, что вы ищете, но я использовал бы атрибут DebuggerNonUserCode
.
Чтобы проиллюстрировать это, здесь приведена измененная версия вашего fiddle. Отладчик не останавливается на ThrowIfCancellationRequested
, хотя OperationCanceledException
включен в диалоговом окне Ctrl + Alt + E Исключения.
using System;
using System.Diagnostics;
using System.Threading;
namespace TestApp
{
static class Ext
{
[System.Diagnostics.DebuggerNonUserCode()]
public static bool TryThrowIfCancellationRequested(
this CancellationToken token)
{
try
{
// debugger won't stop here, because of DebuggerNonUserCode attr
token.ThrowIfCancellationRequested();
return true;
}
catch (OperationCanceledException)
{
return false;
}
}
}
public class Program
{
static bool SomeMethod(CancellationToken token)
{
System.Threading.Thread.Sleep(1000);
return token.TryThrowIfCancellationRequested();
}
public static void Main()
{
var cts = new CancellationTokenSource(1000);
for (var i = 0; i < 10; i++)
{
if (!SomeMethod(cts.Token))
break;
}
}
}
}
Конечно, вы могли бы использовать CancellationToken.IsCancellationRequested
вместо ThrowIfCancellationRequested
в этом конкретном случае, но приведенный выше подход иллюстрирует концепцию, которая может быть расширена до любого другого исключения.
Ответ 2
вы пытаетесь сделать следующее:
Когда включен "Только мой код", Visual Studio в некоторых случаях будет разбиваться на строку, которая генерирует исключение, и выводит сообщение об ошибке "Исключение не обрабатывается кодом пользователя". Эта ошибка является доброкачественной. Вы можете нажать F5 для продолжения работы и увидеть поведение обработки исключений, которое показано в приведенных ниже примерах. Чтобы предотвратить появление первой ошибки Visual Studio, снимите флажок "Только мой код" в разделе "Инструменты", "Параметры", "Отладка", "Общие" .
из здесь
надеюсь, что это поможет
Ответ 3
То, что вы хотите, может быть выражено как
try
{ // #pragma ignore(OperationCancelledException, true)
token.ThrowIfCancellationRequested();
}
catch (OperationCancelledException op)
{ // #pragma ignore(OperationCancelledException, false)
// ignore
}
Но это считается плохой практикой. Исключения должны быть как-то обработаны. По крайней мере, для некоторых причин отладки.