Попробуйте Catch Block - PullRequest
       0

Попробуйте Catch Block

1 голос
/ 07 сентября 2011

Я новичок в C # и никогда не пытался создать блок try catch, я получаю сообщение об ошибке, в котором ошибка указывает, что "ключ уже существует" в одном из HybridDictionary, Как я могу поместить .Adds в триггер Try заблокировать и игнорировать его, если ключ уже существует:

вот оригинальный код с двумя гибридными словарями:

public MWRichTextBox() : base() {

        // Initialize default text and background colors
        textColor = RtfColor.Black;
        highlightColor = RtfColor.White;

        // Initialize the dictionary mapping color codes to definitions
        rtfColor = new HybridDictionary();
        rtfColor.Add(RtfColor.Aqua, RtfColorDef.Aqua);
        rtfColor.Add(RtfColor.Black, RtfColorDef.Black);
        rtfColor.Add(RtfColor.Blue, RtfColorDef.Blue);
        rtfColor.Add(RtfColor.Fuchsia, RtfColorDef.Fuchsia);
        rtfColor.Add(RtfColor.Gray, RtfColorDef.Gray);
        rtfColor.Add(RtfColor.Green, RtfColorDef.Green);
        rtfColor.Add(RtfColor.Lime, RtfColorDef.Lime);
        rtfColor.Add(RtfColor.Maroon, RtfColorDef.Maroon);
        rtfColor.Add(RtfColor.Navy, RtfColorDef.Navy);
        rtfColor.Add(RtfColor.Olive, RtfColorDef.Olive);
        rtfColor.Add(RtfColor.Purple, RtfColorDef.Purple);
        rtfColor.Add(RtfColor.Red, RtfColorDef.Red);
        rtfColor.Add(RtfColor.Silver, RtfColorDef.Silver);
        rtfColor.Add(RtfColor.Teal, RtfColorDef.Teal);
        rtfColor.Add(RtfColor.White, RtfColorDef.White);
        rtfColor.Add(RtfColor.Yellow, RtfColorDef.Yellow);
        rtfColor.Add(RtfColor.WhiteSmoke, RtfColorDef.WhiteSmoke);

        // Initialize the dictionary mapping default Framework font families to
        // RTF font families
        rtfFontFamily = new HybridDictionary();
        rtfFontFamily.Add(FontFamily.GenericMonospace.Name, RtfFontFamilyDef.Modern);
        rtfFontFamily.Add(FontFamily.GenericSansSerif, RtfFontFamilyDef.Swiss);
        rtfFontFamily.Add(FontFamily.GenericSerif, RtfFontFamilyDef.Roman);
        rtfFontFamily.Add(FF_UNKNOWN, RtfFontFamilyDef.Unknown);

        // Get the horizontal and vertical resolutions at which the object is
        // being displayed
        using(Graphics _graphics = this.CreateGraphics()) {
            xDpi = _graphics.DpiX;
            yDpi = _graphics.DpiY;
        }
    }

Ответы [ 8 ]

16 голосов
/ 07 сентября 2011

В качестве альтернативы ловушке , я бы предложил проверить наличие элемента с помощью ключа с помощью метода Contains.Например:

if (!rtfColor.Contains(RtfColor.White))
{
    rtfColor.Add(RtfColor.White, RtfColorDef.White);
}

Давайте рассмотрим это немного дальше, чтобы проиллюстрировать предложение Джима Б. (поскольку это вводит дополнительных строк для каждого добавления и может быстро стать чрезмерным), мы можем создать простойметод «безопасного добавления элементов», то есть добавления элементов в коллекцию только в том случае, если элемент с определенным ключом еще не существует (вы можете применить более конкретную форму в отношении именования методов, доступа и т. д., но в качестве примера):

private void AddItemToDictionary(HybridDictionary dictionary, object key, object value)
{
    if (!dictionary.Contains(key))
    {
        dictionary.Add(key, value);
    }
}

AddItemToDictionary(rtfColor, RtfColor.Black, RtfColorDef.Black);
AddItemToDictionary(rtfColor, RtfColor.White, RtfColorDef.White);
AddItemToDictionary(rtfColor, RtfColor.Red, RtfColorDef.Red);

Это может быть расширено для простого обновления, если это необходимо.

Когда использовать try / catch - это отдельная история, когда использовать try / catch для игнорирования ошибокэто другая жизнь.

2 голосов
/ 07 сентября 2011

, даже если вы заключите свой код в блок try catch, код после строки, которая выдает исключение, не будет выполнен, а будет выполнен только код в блоке catch / finally, поэтому вы должны заключить все .Add заявление (что было бы действительно очень плохо) Вы всегда должны препятствовать тому, чтобы ваш код вызывал исключение, и когда это возможно, вы должны избегать этого. Как насчет создания метода (или метода расширения), который проверяет, существует ли элемент в массиве, и если это не так, элемент будет добавлен? взгляните на метод расширения словаря ниже, он будет работать для любого словаря

 public static class DictionaryExtension
    {
        public static void AddItemIfNotExist<TKey,TValue>(this Dictionary<TKey,TValue> dictionary, TKey key,TValue item)
        {
            if (!dictionary.ContainsKey(key))
            {
                dictionary.Add(key, item);
            }
        }
    }
1 голос
/ 07 сентября 2011

Вы можете просто добавить блок try-catch вокруг всего этого так:

   try
    {
        // Your code inside here
    }
    catch (Exception e)
    {
        // do nothing and be silent
    }

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

0 голосов
/ 07 сентября 2011

Вы не можете.Проблема в том, что если вы получите исключение, вы получите исключение из последовательности попыток.Вам придется либо поставить try / catch перед всеми вызовами метода .Add, либо попытаться сделать это более элегантным способом, а именно:

  1. Сформируйте словарь из всех вашихПары RtfColor / RtfColorDef.
  2. Итерация по нему с циклом foreach.В теле foreach проверьте, находится ли проверяемая пара в rtfColor.В этом случае потребуется только одна попытка / улов.Убедитесь, что вы положили catch {продолжить;}.
0 голосов
/ 07 сентября 2011

Вместо try / catch, просто проверьте, содержит ли словарь уже ключ:

if(!rtfColor.ContainsKey(RtfColor.Aqua))
{
   rtfColor.Add(RtfColor.Aqua, RtfColorDef.Aqua);
}

Проблема с оборачиванием всего объекта в try / catch заключается в том, что вы пропустите все значения, которые пытались выполнить.добавить после того, как выбрасывает исключение.

0 голосов
/ 07 сентября 2011
public MWRichTextBox() : base() { 

        // Initialize default text and background colors 
        textColor = RtfColor.Black; 
        highlightColor = RtfColor.White; 
        try
        {
        // Initialize the dictionary mapping color codes to definitions 
        rtfColor = new HybridDictionary(); 
        rtfColor.Add(RtfColor.Aqua, RtfColorDef.Aqua); 
        rtfColor.Add(RtfColor.Black, RtfColorDef.Black); 
        rtfColor.Add(RtfColor.Blue, RtfColorDef.Blue); 
        rtfColor.Add(RtfColor.Fuchsia, RtfColorDef.Fuchsia); 
        rtfColor.Add(RtfColor.Gray, RtfColorDef.Gray); 
        rtfColor.Add(RtfColor.Green, RtfColorDef.Green); 
        rtfColor.Add(RtfColor.Lime, RtfColorDef.Lime); 
        rtfColor.Add(RtfColor.Maroon, RtfColorDef.Maroon); 
        rtfColor.Add(RtfColor.Navy, RtfColorDef.Navy); 
        rtfColor.Add(RtfColor.Olive, RtfColorDef.Olive); 
        rtfColor.Add(RtfColor.Purple, RtfColorDef.Purple); 
        rtfColor.Add(RtfColor.Red, RtfColorDef.Red); 
        rtfColor.Add(RtfColor.Silver, RtfColorDef.Silver); 
        rtfColor.Add(RtfColor.Teal, RtfColorDef.Teal); 
        rtfColor.Add(RtfColor.White, RtfColorDef.White); 
        rtfColor.Add(RtfColor.Yellow, RtfColorDef.Yellow); 
        rtfColor.Add(RtfColor.WhiteSmoke, RtfColorDef.WhiteSmoke); 

        // Initialize the dictionary mapping default Framework font families to 
        // RTF font families 
        rtfFontFamily = new HybridDictionary(); 
        rtfFontFamily.Add(FontFamily.GenericMonospace.Name, RtfFontFamilyDef.Modern); 
        rtfFontFamily.Add(FontFamily.GenericSansSerif, RtfFontFamilyDef.Swiss); 
        rtfFontFamily.Add(FontFamily.GenericSerif, RtfFontFamilyDef.Roman); 
        rtfFontFamily.Add(FF_UNKNOWN, RtfFontFamilyDef.Unknown); 
        }
        catch
        {
        }
        // Get the horizontal and vertical resolutions at which the object is 
        // being displayed 
        using(Graphics _graphics = this.CreateGraphics()) { 
            xDpi = _graphics.DpiX; 
            yDpi = _graphics.DpiY; 
        } 
    } 
0 голосов
/ 07 сентября 2011

Чтобы игнорировать все исключения:

try {
    // Your code.
}
catch {
}

Чтобы игнорировать только исключение определенного типа:

try {
    // Your code.
}
catch (SpecificException) {
}
0 голосов
/ 07 сентября 2011

Вы должны были бы окружить каждое добавление следующим образом:

try 
{
    rtfColor.Add(RtfColor.Aqua, RtfColorDef.Aqua);
}
catch (Exception e)  // use right type of exception here
{
    // log exception
}

Но было бы лучше использовать ответ мистера Разочарования.

...