C # Как мне перехватить исключение и проверить, содержит ли оно строку? - PullRequest
5 голосов
/ 17 ноября 2008

Я получаю исключение, которое говорит «Отказано в доступе», когда пользовательские разрешения достаточны, как мне перехватить исключение и проверить «Отказано в доступе», чтобы я мог показать пользователю более дружелюбное сообщение «Извините, доступ запрещен»

Спасибо Начинающий: -)

Ответы [ 8 ]

15 голосов
/ 17 ноября 2008

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

try {
    ...
} catch (SomeKindOfException ex) {
    MessageBox.Show(ex.Message);
} catch (AccessDeniedException ex) {
    //Do something else
}
12 голосов
/ 09 мая 2010

Я думаю, что самое безопасное, что можно сделать здесь (и удивительно, что ни один из ответов не показывает это), это

  • Поймать как определенный тип исключения, как вы можете. Старайтесь избегать перехвата всех исключений.
  • Проверьте сообщение об исключении для string.ToLowerInvariant(), содержащее целевую строку.
  • повторно throw, если это не то, что вы ожидаете!

вот так:

try
{
    int result = DoStuff(param);
}
catch (System.IO.IOException ioex)
{
    if (ioex.Message.ToLowerInvariant().Contains("find me"))
    {
        .. do whatever ..
    }
    else
    {
        // no idea what just happened; we gotta crash
        throw;
    }
}
6 голосов
/ 17 ноября 2008

Если вы используете блок try catch ...

try
{
    //error occurs
}
catch (Exception ex)
{
    MessageBox.show(ex.Message);
}

Очевидно, что это довольно дурацкая обработка ошибок, но она показывает, что объект Exception содержит строку ошибки. Вы можете сузить обработку разных исключений, перехватывая разные типы исключений.

Try
{
    //error occurs
}
catch (AccessDeniedException ex)
{
    MessageBox.show(ex.Message);
}
catch (FieldAccessException)
{

}
// etc...
2 голосов
/ 17 ноября 2008

Simple:

try
{
    YourCommandWhichResultsInDeniedAccess();
}
catch (AccessDeniedException)
{
    MessageBox.Show('Access Denied');
}

Если вы не знаете тип исключения и / или хотите вместо него проверить сообщение об исключении, выполните следующие действия:

try
{
    YourCommandWhichResultsInDeniedAccess();
}
catch (Exception e)
{
   if (e.Message == 'Access Denied')
   {
       MessageBox.Show('Access Denied')
   }
}
1 голос
/ 06 ноября 2017

Использование фильтров исключений в C # 6.0 еще проще:

try
{
    int result = DoStuff(param);
}
catch (IOException ex) 
when (ex.Message.ToLowerInvariant().Contains("find me")) 
{
    //.. do whatever ..
}
0 голосов
/ 14 апреля 2019

Вы можете использовать функцию условного улова:

try
{
    // code here which throws exception
}
catch (Exception ex) when(ex.Message.Contains("Access Denied"))
{
    MessageBox.Show("Sorry, Access Denied", "This is a polite error message");
}
0 голосов
/ 24 марта 2016

Просто модификация сверху, но работа с данными, базой данных и выпадающим списком

try {
        drop_grup_head.SelectedValue = ds.Rows[0]["group_head"].ToString();
     }
     catch (Exception exce ) {
        if (exce.Message.ToLowerInvariant().Contains("does not exist in the list")) {
           drop_grup_head.SelectedValue = "0";
        }
     }
0 голосов
/ 17 ноября 2008

Прежде всего - следует изучить проблему с разрешениями, а не заниматься исключительно исключением. Если выброшено «Отказано в доступе», то должны быть проблемы с разрешениями или какая-то блокировка.

В любом случае, «Сообщение» является строкой, и вы можете использовать метод .Contains для проверки «Отказано в доступе».

Вы не можете изменить свойство «Сообщение», так как оно не имеет установщика, но вы можете обработать исключение и отобразить вежливое сообщение.

MessageBox.Show («Извините, доступ запрещен»); например.

Редактировать: как упоминалось выше, вы должны проверить тип исключения. например AccessDeniedException, а не использовать что-то общее, как «Исключение».


try
        {
            // code here which throws exception
        }
        catch (Exception ex)
        {
            if (ex.Message.Contains("Access Denied"))
            {
                MessageBox.Show("Sorry, Access Denied", "This is a polite error message");
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...