2010-09-15 17 views
7

Chcę sprawdzić, czy serwer nie jest dostępny i jeśli nie jest dostępny, chcę wydrukować przyjazny komunikat na mojej stronie logowania. Podobnie jak w przypadku wprowadzenia przez użytkownika danych uwierzytelniających i wyjątku, otrzymałem ten wyjątek od Jak uzyskać Typ wyjątku w C#

A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)

A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)

. W jaki więc sposób powinienem wskazać, kiedy wystąpi wyjątek, aby wyświetlić komunikat?

+0

serwera? Serwer bazy danych? serwer sieciowy? jakie środowisko? pytanie nie jest wcale jasne. – vulkanino

+0

To C++ jest C# – PostMan

+0

@vulkanino: Wyjątek, który piszę w moim pytaniu, wyraźnie sugerujący, jaki typ wyjątku otrzymuję ... jego związany z serwerem bazy danych –

Odpowiedz

7

Można spróbować złapanie SQLException:

try 
{ 
    // Try sending a sample SQL query 
} 
catch (SQLException ex) 
{ 
    // Print error message 
} 
0

Trzeba złapać wyjątek:

try 
{ 
     //Contact the server 
} 
catch(YourCouldNotContactServerException) 
{ 
    //Show some friendly message 
} 
12

Musisz wiedzieć, co kodu czasie co wyjątki się spodziewać, aby je złapać odpowiednio. Jak stwierdził Dimitrov, wyrzucany jest wyjątek SQLException, gdy połączenie z serwerem SQL kończy się niepowodzeniem, więc złapanie tego jest dobrą taktyką.

chcesz złapać różne wyjątki w porządku, tak jak poniżej:

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 
} 

spróbować umieścić najbardziej niezwykłe wyjątki na górze, na swój sposób pracy w dół listy w kierunku bardziej spotykane. Sekwencja catch jest sekwencyjna - jeśli umieścisz catch (Exception) u góry, zawsze będzie on przechwytywał tę linię, niezależnie od tego, jakie wyjątki kodujesz poniżej.

-1

myślę, rozwiązaniem jest ..

catch (Exception ex) { Responce.Write ("Wystąpił błąd:" + ex.Message); }

0
try 
{ 
    // Your code 
} 
catch (SQLException ex) 
{ 
    Response.Write(ex.Message);//for web apps 
Console.WriteLine(ex.Message);//for windows apps 
} 
+0

Użyj 'ex.ToString()' zamiast 'ex.Message' – Dinei

6

można użyć tej samej metody, której używasz, aby sprawdzić, czy dana klasa dominująca jest typu podklasy, która odbywa się za pomocą

obj is NotImplementedException 

gdzie obj jest typu Exception klasy przodka wszystkie wyjątki.

lub jeśli chcesz korzystać z obiektu wyjątku później można użyć:

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

Logika ta jest szczególnie przydatna, gdy masz scentralizowany klasę dla wyjątków obsługi i dont chcesz dodać wiele instrukcji catch

Mam nadzieję, że to pomoże.

+0

Takie podejście jest również przydatne w przypadku zdarzeń związanych z błędami, a nie wychwyconych wyjątków - na przykład w przypadku zdarzenia OnSubscriptionError Exchange Web Services, w którym wyjątek jest przekazywany jako właściwość Exception w parametrze SubscriptionErrorEventArgs. –

2
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 i using są prawie takie same. using spróbuje coś zrobić z obiektem, niezależnie od tego, czy mu się uda, czy nie, usunie obiekt, aby zatrzymać wyciek pamięci, ale nie zignoruje błędu uniemożliwiającego kontynuowanie kodu.

Try spróbuje wykonać kod wewnątrz szelki, jeśli wystąpi błąd to zignorować błąd i wyjść z klauzuli Try, a następnie przejść na odczyt kodu, chyba że błąd jest krytyczny, który powoduje, że program przestanie działać.Jednak gdy strumienie using nie będą zapewniać zamknięcia/likwidacji strumienia, ponieważ po wystąpieniu błędu kończy się klauzula try, zanim osiągnie jakikolwiek kod, który mógłbyś dodać na dole, aby go wyrzucić (zła praktyka imo). Kod

Try wymaga podania Catch (s) i/lub Finally. Catch umożliwia obsługę wyjątków, generalnie lub określonych wyjątków. przykładem może być użycie, do wygenerowania pliku tekstowego błędu i zapisania go. using nie pozwoli Ci obsługiwać wyjątków.

Inny przykład: using może być, masz listę odtwarzania, utwór nie może zostać znaleziony, obszar wyjątków nullreferece może usunąć pozycję z listy.

Finally jest zawsze wykonywany, nawet jeśli błąd jest krytyczny i wywala program, kod wewnątrz klauzuli finally zostanie wykonany, z obiektami strumienia jest to, gdzie powinno być umieszczenie kodu zbyć, tak, że jeśli obiekt nie w klauzuli try zawsze usuwane.

Mam nadzieję, że pomogłem przedstawić pewną przejrzystość w zakresie używania i try/catch/.

16

Wiem, że jest to starszy wpis, ale jeśli masz zamiar obsługiwać wszystkie wyjątki w ten sam sposób i/lub używasz informacji do raportów o błędach lub czegoś podobnego (zamiast powiadamiania użytkownika o konkretach), możesz użyć następujące.

try 
{ 
    //do something here 
} 
catch(Exception ex) 
{ 
    MessageBox.Show(ex.GetType().ToString()); //will print System.NullReferenceException for example 
} 
Powiązane problemy