Как получить тип исключения в C # - PullRequest
9 голосов
/ 15 сентября 2010

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

При установлении соединения с SQL Server произошла ошибка, связанная с сетью или экземпляром. Сервер не найден или не был доступен. Убедитесь, что имя экземпляра указано правильно и что SQL Server настроен для разрешения удаленных подключений. (поставщик: поставщик именованных каналов, ошибка: 40 - не удалось открыть соединение с SQL Server)

это исключение. Так, как я должен, когда, какое исключение произошло, чтобы я мог отобразить сообщение?

Ответы [ 8 ]

22 голосов
/ 28 сентября 2014

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

try
{
    //do something here
}
catch(Exception ex)
{
    MessageBox.Show(ex.GetType().ToString()); //will print System.NullReferenceException for example
}
13 голосов
/ 15 сентября 2010

Вы должны знать во время кода, какие исключения ожидать, чтобы соответствующим образом их перехватить.Как заявил Димитров, SQLException генерируется при сбое подключения к серверу SQL, поэтому отлов это, в частности, хорошая тактика.

Вы хотите перехватывать различные исключения по порядку, например:

try 
{
    //some code
}
catch(TypeOfException exOne) 
{
    //handle TypeOfException someway
}
catch (OtherTypeOfException exTwo) 
{
    //handle OtherTypeOfException some other way
}
catch (Exception ex) 
{
    //handle unknown exceptions in a general way
}
finally 
{
    //any required cleanup code goes here
}

Постарайтесь поместить самые необычные исключения вверху, прокладывая путь вниз по списку к более распространенным.Последовательность перехвата является последовательной - если вы поместите catch (Exception) вверху, он всегда будет перехватывать эту строку независимо от того, какие исключения вы кодируете под ней.

7 голосов
/ 15 сентября 2010

Вы можете попробовать поймать SQLException :

try 
{
    // Try sending a sample SQL query
} 
catch (SQLException ex) 
{
    // Print error message
}
6 голосов
/ 15 сентября 2010

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

 obj is NotImplementedException

, где ваш объект имеет тип Exception, родительский класс всех исключений.

или если вы хотите использовать объект исключения позже, вы можете использовать:

var niException=obj as NotImplementedException
if(niException==null)  //will be null when object is not of type NotImplementedException
return;

Эта логика особенно полезна, когда у вас есть централизованный класс для обработки исключений и вы не хотите добавлять несколько перехватчиковзаявления

Надеюсь, это поможет.

2 голосов
/ 23 декабря 2012
try  {
 //some code } catch(TypeOfException exOne)  {
 //handle TypeOfException someway } catch (OtherTypeOfException exTwo)  {
 //handle OtherTypeOfException some other way } catch (Exception ex)  {
 //handle unknown exceptions in a general way } finally  {
 //any required cleanup code goes here }

try/finally и using почти одинаковы. using попытается что-то сделать с объектом, независимо от того, удастся он или нет, он избавится от объекта, чтобы остановить утечку памяти, но не проигнорирует ошибку, препятствующую продолжению кода.

Try попытается выполнить код внутри фигурных скобок, если произойдет ошибка, она проигнорирует ошибку и выйдет из условия Try, затем продолжит чтение кода, если только ошибка не является критической, что вызывает сбой программы , Однако, когда using потоков, это не гарантирует, что поток закрыт / утилизируется, потому что, когда происходит ошибка, он выходит из условия try, прежде чем достигнет любого кода, который вы могли бы добавить внизу для удаления (плохая практика imo).

Код

Try требует либо Catch (s), и / или Finally. Catch дает вам возможность обрабатывать исключения, как правило, так и конкретные исключения. Примером использования может быть сгенерировать текстовый файл ошибки и сохранить его. using не позволит вам обрабатывать исключения.

другой пример using может быть, у вас есть список воспроизведения, не удается найти песню, область исключений nullreferece может удалить элемент из списка.

Finally всегда выполняется, даже если ошибка является критической и происходит сбой программы, будет выполнен код в предложении finally, с объектами потока это то место, куда вы должны поместить свой код утилизации, так что если объект терпит неудачу в предложении try, от которого он всегда избавляется.

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

0 голосов
/ 15 сентября 2010
 try 
{
    // Your code
} 
catch (SQLException ex) 
{
    Response.Write(ex.Message);//for web apps
Console.WriteLine(ex.Message);//for windows apps
}
0 голосов
/ 15 сентября 2010

я думаю, решение есть ..

поймать (исключение ex) { Responce.Write ("Произошла ошибка:" + ex.Message); }

0 голосов
/ 15 сентября 2010

Вы должны поймать исключение:

try
{
      //Contact the server
}
catch(YourCouldNotContactServerException)
{
    //Show some friendly message
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...