Предотвращение случайных исключений в окнах вывода

Можно ли в Visual Studio 2010 предотвратить запись исключений при первой возможности в окно вывода? У нас есть сценарий, в котором есть много приведений, которые не работают по дизайну, а окно вывода действительно замедляет работу приложения при отладке. Запись Произошло первое случайное исключение типа «System.InvalidCastException» ... снова и снова просто занимает много времени. Консоль в Visual Studio не быстрая: ‹)

Я знаю о возможности не прерывать работу при первом исключении, но это, похоже, не влияет на окна вывода. Также не следует помещать это перед областью, которая нас тормозит:

Debug.Listeners.Clear()

Закрытие окна вывода тоже не помогает. Однако в режиме выпуска он работает очень быстро.

Любая помощь приветствуется!


person bopapa_1979    schedule 05.06.2012    source источник
comment
Щелкните правой кнопкой мыши окно «Вывод» и снимите флажок «Сообщения об исключениях». Это делает то, о чем вы просите, но не делает то, на что вы надеетесь. Это сделает только оператор as.   -  person Hans Passant    schedule 05.06.2012
comment
Похоже, проблема здесь в количестве исключений больше, чем в скорости вывода на консоль. Исключения недопустимого приведения можно предотвратить, проверив тип до приведения. Мне искренне интересно узнать, почему это сделано намеренно, и почему вы не просто проверяете тип, прежде чем пытаться преобразовать объект.   -  person Iridium    schedule 05.06.2012
comment
@Iridium - Спасибо за комментарий. Вы заставили меня задуматься, и в итоге я использовал тот же шаблон, что и TryParse, но с TryCast. Я отправлю связанный код в ответ.   -  person bopapa_1979    schedule 05.06.2012


Ответы (2)


Я могу ответить на это для Visual Studio 2013:

В VS 2013 вы можете перейти в меню ОТЛАДКА - Параметры и настройки ... - Отладка - Окно вывода. В разделе «Общие настройки вывода» вы найдете «Сообщения об исключениях». Выключи.

person huha    schedule 16.06.2015

Согласно комментарию @Iridium, я перешел на шаблон Try и вернул bool в качестве флага успеха вместо того, чтобы бросать InvalidCastException. Выглядит примерно так:

if (!property.CanAssignValue(valueToSet))
{
    Debug.Write(string.Format("The given value {0} could not be assigned to property {1}.", value, property.Name));
    return false;
}
property.SetValue(instance, valueToSet, null);
return true;

CanAssignValue превратилось в три быстрых расширения:

public static bool CanAssignValue(this PropertyInfo p, object value)
{
    return value == null ? p.IsNullable() : p.PropertyType.IsInstanceOfType(value);
}

public static bool IsNullable(this PropertyInfo p)
{
    return p.PropertyType.IsNullable();
}

public static bool IsNullable(this Type t)
{
    return !t.IsValueType || Nullable.GetUnderlyingType(t) != null;
}

Спасибо!

person bopapa_1979    schedule 05.06.2012