[C# / .NET] Kan SqlException niet opvangen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Davio
  • Registratie: November 2007
  • Laatst online: 06-01 16:46
Beste Tweakers,

Ik breek mijn hoofd al anderhalve dag over het volgende stukje code:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private bool validateDb(string connString)
        {
            using (SqlConnection conn = new SqlConnection(connString))
            {
                try
                {
                    conn.Open();
                    return true;
                }
                catch
                {
                    MessageBox.Show("Test");
                    return false;
                }
            }


Excuseer de layout, copy-paste ging niet lekker.

Hij knalt er elke keer uit met een SqlException met de melding 'Logon failed', dit is niet gek want de logon klopt inderdaad niet en dat is juist de bedoeling.
Het gaat erom dat hij er keihard uitknalt en niet netjes wordt afgevangen.
Hij komt dus nooit in mijn catch, maar de debugger springt in de code met een melding.
En hij springt naar de regel die na de conn.Open() staat, in dit geval dus return true.

Als ik in mijn Project Properties het vangen van exceptions voor Unmanaged Code uitzet, dan springt hij gelijk in de Code, als ik het vangen aanzet krijg ik nog een DialogBox waar ik kan kiezen voor Break en Continue, maakt dus niet veel uit verder.

Ik probeer trouwens gewoon een verbinding te testen door met ingevoerde gegevens en een met SqlQueryBuilder opgebouwde Connection String het openen van de verbinding te proberen. Het faalt echter elke keer jammerlijk.

Ik waardeer jullie hulp op voorhand voor deze breinbreker.


Korte samenvatting: Exception wordt niet afgevangen door mijn 'catch-all', hij knalt er gewoon uit.

Acties:
  • 0 Henk 'm!

  • beany
  • Registratie: Juni 2001
  • Laatst online: 17-09 13:56

beany

Meeheheheheh

En als je een release build maakt en die buiten visual studio start?

Dagelijkse stats bronnen: https://x.com/GeneralStaffUA en https://www.facebook.com/GeneralStaff.ua


Acties:
  • 0 Henk 'm!

  • Ventieldopje
  • Registratie: December 2005
  • Laatst online: 17-09 10:59

Ventieldopje

I'm not your pal, mate!

Moet het niet catch(Exception ex) zjin?.

www.maartendeboer.net
1D X | 5Ds | Zeiss Milvus 25, 50, 85 f/1.4 | Zeiss Otus 55 f/1.4 | Canon 200 f/1.8 | Canon 200 f/2 | Canon 300 f/2.8


Acties:
  • 0 Henk 'm!

  • defiant
  • Registratie: Juli 2000
  • Laatst online: 02:47

defiant

Moderator General Chat
Oeps, iets te snel op verstuur gedrukt.

Als je het volgende probeert, werkt het dan wel:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
private bool validateDb(string connString)
        {
            SqlConnection conn = new SqlConnection(connString)
                try
                {
                    conn.Open();
                    return true;
                }
                catch
                {
                    MessageBox.Show("Test");
                    return false;
                }
                finally 
               {
                  conn.Dispose();
               }
}
         

[ Voor 16% gewijzigd door defiant op 04-03-2011 13:54 ]

"When I am weaker than you I ask you for freedom because that is according to your principles; when I am stronger than you I take away your freedom because that is according to my principles"- Frank Herbert


Acties:
  • 0 Henk 'm!

  • DonJunior
  • Registratie: Februari 2008
  • Laatst online: 21:59
Ventieldopje schreef op vrijdag 04 maart 2011 @ 13:48:
Moet het niet catch(Exception ex) zjin?.
Nee, dat is niet verplicht. Men kan een exception ook afvangen zonder een bericht op te vangen.

*sowieso


Acties:
  • 0 Henk 'm!

  • lier
  • Registratie: Januari 2004
  • Laatst online: 20:01

lier

MikroTik nerd

defiant schreef op vrijdag 04 maart 2011 @ 13:52:
Als je het volgende probeert, werkt het dan wel:
Uiteraard werkt het dan wel...

Volgens mij stelt de TS vast dat bij het gebruik van using geen exceptions (door)gegooid worden. En volgens mij is dat een van de zaken (afgezien van het disposen van objecten) dat bij design zo geregeld is.

Eerst het probleem, dan de oplossing


Acties:
  • 0 Henk 'm!

  • mlowijs
  • Registratie: September 2005
  • Laatst online: 31-03-2022
Zet je
C#:
1
SqlConnection conn = new SqlConnection(connString)

ook eens in de try-clausule?

Acties:
  • 0 Henk 'm!

  • defiant
  • Registratie: Juli 2000
  • Laatst online: 02:47

defiant

Moderator General Chat
lier schreef op vrijdag 04 maart 2011 @ 13:56:
Volgens mij stelt de TS vast dat bij het gebruiker van using geen exceptions (door)gegooid worden. En volgens mij is dat een van de zaken (afgezien van het disposen van objecten) dat bij design zo geregeld is.
Dat lijkt me ook ja.

"When I am weaker than you I ask you for freedom because that is according to your principles; when I am stronger than you I take away your freedom because that is according to my principles"- Frank Herbert


Acties:
  • 0 Henk 'm!

  • MindStorm
  • Registratie: Juli 2002
  • Laatst online: 16-01-2024
Moet je wel binnen die try { } returnen?

Acties:
  • 0 Henk 'm!

  • lier
  • Registratie: Januari 2004
  • Laatst online: 20:01

lier

MikroTik nerd

Ik zit er nog eens naar te kijken en het verbaast me eigenlijk dat het niet werkt...

Kan je als test nog de using binnen een try/catch block opnemen?
Het lijkt er namelijk op dat de Exception door de using gegooid wordt in plaats van door de .Open() methode.
MindStorm schreef op vrijdag 04 maart 2011 @ 14:03:
Moet je wel binnen die try { } returnen?
Ja. ;)

[ Voor 23% gewijzigd door lier op 04-03-2011 14:06 ]

Eerst het probleem, dan de oplossing


Acties:
  • 0 Henk 'm!

  • lier
  • Registratie: Januari 2004
  • Laatst online: 20:01

lier

MikroTik nerd

Ik heb dit stukje code net geschreven...lees en huiver/verbaas je/geniet/whatever...

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
using System;

namespace TestLibrary
{
    public class Class1
    {
        public static void Main()
        {
            try
            {
                using (ExceptionClass myClass = new ExceptionClass())
                {
                    try
                    {
                        myClass.ThrowMyException();
                    }
                    catch
                    {
                        Console.WriteLine(string.Format("Exception caught by inner block"));
                    }
                }
            }
            catch
            {
                Console.WriteLine(string.Format("Exception caught by outer block"));
            }
            finally
            {
                Console.ReadLine();
            }
        }
    }

    public class ExceptionClass: IDisposable
    {
        public ExceptionClass()
        {}

        public void ThrowMyException()
        { throw new Exception(); }

        public void Dispose()
        {}
    }
}

Het vreemde is dat je hier alleen bij de inner try/catch de exceptie tegen komt (in tegenstelling tot jouw verhaal). Zit nu even de SqlConnection.Open Method info te lezen.

[ Voor 172% gewijzigd door lier op 04-03-2011 14:15 ]

Eerst het probleem, dan de oplossing


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 01:56
lier schreef op vrijdag 04 maart 2011 @ 13:56:
[...]

Uiteraard werkt het dan wel...

Volgens mij stelt de TS vast dat bij het gebruik van using geen exceptions (door)gegooid worden. En volgens mij is dat een van de zaken (afgezien van het disposen van objecten) dat bij design zo geregeld is.
Dat is BS. Using gaat geen exceptions opeten.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • Ventieldopje
  • Registratie: December 2005
  • Laatst online: 17-09 10:59

Ventieldopje

I'm not your pal, mate!

DonJunior schreef op vrijdag 04 maart 2011 @ 13:53:
[...]


Nee, dat is niet verplicht. Men kan een exception ook afvangen zonder een bericht op te vangen.
Maar wel bad practice lijkt me, je weet nu niet om wat voor exception het gaat en je kunt ook geen informatie doorgeven aan bijvoorbeeld de UI ;)

@Davio
Weet je zeker dat de exception gegooid wordt door conn.Open() en dat het niet al mis gaat bij new SqlConnection?

www.maartendeboer.net
1D X | 5Ds | Zeiss Milvus 25, 50, 85 f/1.4 | Zeiss Otus 55 f/1.4 | Canon 200 f/1.8 | Canon 200 f/2 | Canon 300 f/2.8


Acties:
  • 0 Henk 'm!

  • lier
  • Registratie: Januari 2004
  • Laatst online: 20:01

lier

MikroTik nerd

whoami schreef op vrijdag 04 maart 2011 @ 14:12:
Dat is BS. Using gaat geen exceptions opeten.
Idd...ik heb het een beetje omgedraaid.

using is het equivalent van een try/finally block, de exceptie wordt (uiteraard) gewoon naar boven door gegooid.

Eerst het probleem, dan de oplossing


Acties:
  • 0 Henk 'm!

  • Ventieldopje
  • Registratie: December 2005
  • Laatst online: 17-09 10:59

Ventieldopje

I'm not your pal, mate!

lier schreef op vrijdag 04 maart 2011 @ 14:16:
[...]

Idd...ik heb het een beetje omgedraaid.

using is het equivalent van een try/finally block, de exceptie wordt (uiteraard) gewoon naar boven door gegooid.
Het enige dat using doet is tijdelijk een resource gebruiken en die daarna automatisch disposen ;)

www.maartendeboer.net
1D X | 5Ds | Zeiss Milvus 25, 50, 85 f/1.4 | Zeiss Otus 55 f/1.4 | Canon 200 f/1.8 | Canon 200 f/2 | Canon 300 f/2.8


Acties:
  • 0 Henk 'm!

  • lier
  • Registratie: Januari 2004
  • Laatst online: 20:01

lier

MikroTik nerd

Ventieldopje schreef op vrijdag 04 maart 2011 @ 14:19:
Het enige dat using doet is tijdelijk een resource gebruiken en die daarna automatisch disposen ;)
Idd, zie ook mijn code voorbeeld. Ik doelde meer vanuit Exception perspectief.

Eerst het probleem, dan de oplossing


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 01:56
Ventieldopje schreef op vrijdag 04 maart 2011 @ 14:15:
[...]


Maar wel bad practice lijkt me, je weet nu niet om wat voor exception het gaat en je kunt ook geen informatie doorgeven aan bijvoorbeeld de UI ;)
Dat hoeft toch niet altijd ? Als je bv de exceptie kunt afvangen, en het probleem corrigeren, dan hoef je de gebruiker niet lastig te vallen met een melding dat er iets is foutgegaan, als je het zelf in code hebt kunnen oplossen.
je kan het natuurlijk wel loggen.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • Korben
  • Registratie: Januari 2001
  • Laatst online: 13-07 01:53

Korben

() => {};

whoami schreef op vrijdag 04 maart 2011 @ 14:38:
[...]
Dat hoeft toch niet altijd ? Als je bv de exceptie kunt afvangen, en het probleem corrigeren, dan hoef je de gebruiker niet lastig te vallen met een melding dat er iets is foutgegaan, als je het zelf in code hebt kunnen oplossen.
je kan het natuurlijk wel loggen.
Als je een catch-block hebt zonder exceptie-type, weet je uiteraard niet wat voor soort exceptie je hebt gevangen. Hoe kun je een situatie corrigeren als je niet weet wat voor soort situatie dat is? Voor hetzelfde geld is het een OutOfMemoryException. Knappe jongen die dat corrigeert ;)

offtopic:
Ik snap natuurlijk wel dat dit niet is wat je bedoelt, maar ik wou het punt even ter educatie opvoeren.

.oisyn: Échte programmeurs haten PHP met een passie. Ben jij soms geen echte programmeur?


Acties:
  • 0 Henk 'm!

  • lier
  • Registratie: Januari 2004
  • Laatst online: 20:01

lier

MikroTik nerd

Korben schreef op vrijdag 04 maart 2011 @ 15:05:
offtopic:
Ik snap natuurlijk wel dat dit niet is wat je bedoelt, maar ik wou het punt even ter educatie opvoeren.
code:
1
2
3
4
catch(OutOfMemoryException)
{
  if(OS.NumberOfBits != 64) { StartInstallBetterOS();}
}

Eerst het probleem, dan de oplossing


Acties:
  • 0 Henk 'm!

  • Hooiopdevork
  • Registratie: December 2008
  • Laatst online: 25-05-2023
Kun je ook niet SqlException opvangen
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
private bool validateDb(string connString) 
        { 
            using (SqlConnection conn = new SqlConnection(connString)) 
            { 
                try 
                { 
                    conn.Open(); 
                    return true; 
                } 
               Catch (SqlException sqlEx){  
                   MessageBox.Show("Test"); 
                    return false; 
               }           
 } 

Acties:
  • 0 Henk 'm!

  • lier
  • Registratie: Januari 2004
  • Laatst online: 20:01

lier

MikroTik nerd

Hooiopdevork schreef op vrijdag 04 maart 2011 @ 15:20:
Kun je ook niet SqlException opvangen
SqlException is een specialisatie van Exception, dus door een catch te doen (desnoods expliciet door Exception te vangen, maar dat gebeurt impliciet al) wordt ook de SqlException afgevangen.

Eerst het probleem, dan de oplossing


Acties:
  • 0 Henk 'm!

  • Davio
  • Registratie: November 2007
  • Laatst online: 06-01 16:46
Bedankt voor alle reacties, ik had misschien al moeten melden wat ik geprobeerd had, maar ik moest even weg om een biljart te verhuizen, stond niet in mijn functieomschrijving, maar moet kunnen.

Ik heb geprobeerd om het using-block te vervangen en het aanmaken van de SqlConnection in de try-catch te gooien. Maakte geen verschil.

Ik heb geprobeerd om een specifieke Exception catch(SqlException sqlEx) op te vangen, geen resultaat. Ook heb ik het met catch(Exception ex) geprobeerd, werkte allemaal niet.

Ik weet zeker dat het fout gaat bij Open() omdat de debugger daarheen springt.

Ik heb hem van Debug op Release gezet, ook geen verschil.

Aan- en uitvinken van Enable xxx Debugging in Property settings maakte ook niks uit.


Ik snap gewoon niet waarom hij de exception niet afvangt!
Als alle settings binnen de connection string goedstaan, maakt hij trouwens verbinding zonder exception.

Acties:
  • 0 Henk 'm!

  • lier
  • Registratie: Januari 2004
  • Laatst online: 20:01

lier

MikroTik nerd

Als je onderstaande probeert zou het volgens mij moeten werken (even los van of dit een gewenste oplossing is).

[code=C#]private bool validateDb(string connString)
{
try
{
using (SqlConnection conn = new SqlConnection(connString))
{
try
{
conn.Open();
return true;
}
catch
{
return false;
}
}
}
catch
{
return false;
}
}[/code=C#]

Eerst het probleem, dan de oplossing


Acties:
  • 0 Henk 'm!

  • Davio
  • Registratie: November 2007
  • Laatst online: 06-01 16:46
Helaas, geprobeerd, maar zelfde problemen.

Acties:
  • 0 Henk 'm!

  • FireDrunk
  • Registratie: November 2002
  • Laatst online: 17-09 08:50
Op de microsoft site staat het volgende voorbeeld:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public static void ShowSqlException(string connectionString)
{
    string queryString = "EXECUTE NonExistantStoredProcedure";
    StringBuilder errorMessages = new StringBuilder();

    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        SqlCommand command = new SqlCommand(queryString, connection);
        try
        {
            command.Connection.Open();
            command.ExecuteNonQuery();
        }
        catch (SqlException ex)
        {
            for (int i = 0; i < ex.Errors.Count; i++)
            {
                errorMessages.Append("Index #" + i + "\n" +
                    "Message: " + ex.Errors[i].Message + "\n" +
                    "LineNumber: " + ex.Errors[i].LineNumber + "\n" +
                    "Source: " + ex.Errors[i].Source + "\n" +
                    "Procedure: " + ex.Errors[i].Procedure + "\n");
            }
            Console.WriteLine(errorMessages.ToString());
        }
    }
}


Het zou dus gewoon moeten werken...

Even niets...


Acties:
  • 0 Henk 'm!

  • Davio
  • Registratie: November 2007
  • Laatst online: 06-01 16:46
Ja, het gekke is ook dat het in een ander project wel werkt...

En ik heb voor zover ik weet niets geks in de settings van dit project staan...

Zelfde .NET target (3.5).

Acties:
  • 0 Henk 'm!

  • FireDrunk
  • Registratie: November 2002
  • Laatst online: 17-09 08:50
ooo, wacht... Je kunt Visual Studio zo inregelen dat hij bepaalde exceptions voor jou opvangt, en bepaalde expliciet niet. Misschien moet je dat eens onderzoeken.

Even niets...


Acties:
  • 0 Henk 'm!

  • masterpoi
  • Registratie: Oktober 2004
  • Laatst online: 22-06 18:50
FireDrunk schreef op vrijdag 04 maart 2011 @ 17:21:
ooo, wacht... Je kunt Visual Studio zo inregelen dat hij bepaalde exceptions voor jou opvangt, en bepaalde expliciet niet. Misschien moet je dat eens onderzoeken.
Klopt. Om dat uit te sluiten kan je twee dingen testen:

Zonder debugger runnen: CTRL+f5 of debug> start without debugging

Exception settings resetten: Debug > Exceptions > Reset all.

Acties:
  • 0 Henk 'm!

  • Davio
  • Registratie: November 2007
  • Laatst online: 06-01 16:46
masterpoi schreef op vrijdag 04 maart 2011 @ 17:28:
[...]


Klopt. Om dat uit te sluiten kan je twee dingen testen:

Zonder debugger runnen: CTRL+f5 of debug> start without debugging

Exception settings resetten: Debug > Exceptions > Reset all.
Het door mij dikgemaakte stuk werkte uiteindelijk. Misschien dat ik het voor een vorig project eens heb aangezet (en misschien gedacht dat dit een per project setting was) en vergeten uit te zetten.

Nu valt hij wel netjes in de catch.

Blij dat ik dit op vrijdag om half 6 nog voor elkaar heb gekregen, dank allen. :)
Pagina: 1