Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Till frågan om 'On Error Go To ...'

Postades av 2009-09-04 17:25:23 - Hans Nyberg, i forum visual basic - allmänt, Tråden har 8 Kommentarer och lästs av 2012 personer

Jag hänvisar till tidigare inlägg om 'On Error Go To ..", vilken diskussion inte tycks ha löst det grundläggande problemet.

Nedanståend sekvens är stansad från 'Connell; Beginning Visual Basic 6 Database Programming'.

-----------
Private Sub cmdErrors_Click()
Dim adoConnection As ADODB.Connection

On Error GoTo AdoError

Set adoConnection = New ADODB.Connection

adoConnection.connectionString = "DBQ=BIBLIO.MDB;" & _
"DRIVER={Microsoft Access Driver (*.mdb)};" & _
"Default Dir=C:\OhNooo\Directory\Path;"

adoConnection.Open
'Remaining code goes here, but of course our program
'will never reach it because the connection string
'will generate an error because of the bogus directory
--------

I sekvensen ovan får jag inte Error att fungera.

Nedansltående sekvens är kopierad från exempelprogrammet till samma formulär.
----------------
Private Sub Command1_Click()
Dim adoConnection As ADODB.Connection

On Error GoTo AdoError

Set adoConnection = New ADODB.Connection

' Open connection to Bogus ODBC Data Source for BIBLIO.MDB
adoConnection.connectionString = "DBQ=BIBLIO.MDB;" & _
"DRIVER={Microsoft Access Driver (*.mdb)};" & _
"DefaultDir=C:\OhNooo\Directory\Path;"

adoConnection.Open
------------

I det här fallet fungerar Error men jag kan inte se någon skillnad på koden. Lösning?



Svara

Sv: Till frågan om 'On Error Go To ...'

Postades av 2009-09-07 11:18:04 - Åsa Holmgren

Exemplens connection string skiljer sig åt, det är förklaringen. I det exemplet där din felhantering inte fungerar innehåller connection stringen ett felaktigt attribut ("Default Dir" ska vara "DefaultDir") vilket resulterar i ett ADO-fel som inte hanteras med "On Error".

Testa detta:

...
adoConnection.Open

Dim lErr As Long
For lErr = 0 To adoConnection.Errors.Count - 1
    Debug.Print adoConnection.Errors.Item(lErr).Description
Next lErr


Svara

Sv:Till frågan om 'On Error Go To ...'

Postades av 2009-09-16 20:28:02 - Hans Nyberg

Intressant.

Betyder detta då att alla ADO-fel (medvetet) inte fångas upp av On Error?


Svara

Sv: Till frågan om 'On Error Go To ...'

Postades av 2009-09-17 14:06:49 - Åsa Holmgren

Enligt Microsoft SKA man få ett "run-time error" också... Vet inte varför det inte blev så här.

http://msdn.microsoft.com/en-us/library/ms678380(VS.85).aspx


Svara

Sv:Till frågan om 'On Error Go To ...'

Postades av 2009-09-17 20:17:31 - Niklas Jansson

Notera att exempelkoden fungerar utmärkt även om det inte kastas ett fel. (Som vidare visar att VBs felhantering är att betrakta som ett skämt...)


Svara

Sv: Till frågan om 'On Error Go To ...'

Postades av 2009-09-18 00:01:24 - Sven Åke Persson

Niklas ! Ahhhhhhhh Nu tog du i.

Hade det inte för att vara du så hade jag sagt att du är ett stort skämt.

Snabbt så ser jag Default Dir och DefaultDir är två helt skilda saker.

Det där djä... ADO är ett stort djä... skämt.


Svara

Sv:Till frågan om 'On Error Go To ...'

Postades av 2009-09-18 09:44:19 - Niklas Jansson

Normalt sett så vill man arbeta typ så här:
1. Kör kod.
2. Om inget fel händer, gör ingenting.

Dvs
Public Sub DoStuff
Kod
End Sub



Normalt sett anser jag att man inte ska lägga till felhantering, utan se till att fel inte uppstår - alltså, låt säga att du har en kod:

for i = lbound(x) to ubound(x)

Där x är en variant (skippa den diskussionen just nu). Du märker efter ett tag att programmet kraschar på den här raden. (Vilket beror på att x inte blivit dimensionerad till en array). Det finns tre lösningar:

if isarray(x) then
for i = lbound(x) to ubound(x)

Då vet man exakt vad felet är och hanterar det när det uppstår, och kan också ge ett svar på varför det hänt. Eller:

on error resume next
for i = lbound(x) to ubound(x)
if err.number>0 then
...
on error goto 0

Då låter man det bli ett fel men hanterar det där felet uppstår, så man vet fortfarande exakt var felet uppstår. Men det är fan så mycket mer kod. Detta tycker jag ändå är helt ok (i andra scenarier är det inte lämpligt eller enkelt att kontrollera om något går att göra först, och då får man helt enkelt låta det bli ett fel som man sen får hantera direkt).

Slutligen har vi den "vanliga" lösningen:

on error goto Catch
for i = lbound(x) to ubound(x)

Catch:
if err.number = 23 then 'vet inte exakt vilket nummer, men typ så här
...
else
...


Det gör att man hanterar felet i en helt annan del av funktionen - för något som kanske är ett ganska litet fel och som man kan komma runt. Vidare vill man ofta stänga massa grejer i slutet av funktionen, typ:

on error goto Catch
for i = lbound(x) to ubound(x)


Catch:
if err.number = 23 then 'vet inte exakt vilket nummer, men typ så här
transaction.rollback
elseif err.number = 18 then
transaction.rollback
else
transaction.commit
end if

Är det många tänkbara fel blir det bra mycket kod för att alltid köra rollback i varje fel. Då kommer man till slut till antingen:

on error goto Catch
for i = lbound(x) to ubound(x)

goto NoError
Catch:
if err.number = 23 then 'vet inte exakt vilket nummer, men typ så här
...
elseif err.number = 18 then
...
end if
transaction.rollback
goto EndOfFunction
NoError:
transaction.commit
EndOfFunction:
End sub


Eller:

on error goto Catch
for i = lbound(x) to ubound(x)

goto NoError
Catch:
If err.number>0 then
if err.number = 23 then 'vet inte exakt vilket nummer, men typ så här
...
elseif err.number = 18 then
...
end if
transaction.rollback
else
transaction.commit
end if
End sub


Inte speciellt stilig kod, eller hur? Så fort man lägger till felhantering av den här arten i VB blir det bara galet. Exceptions är en mycket mer naturlig modell, även om den också är ganska bristfällig.

Det handlar fortfarande om att du i praktiken gör en catch, men med skillnaden:
1. Du får mycket rikare information om vad det är för fel.
2. Hela goto-harangen är underförstådd.

Alltså (vb.net/c#/c++):

try
kod
catch errortype1
hantera detta
catch errortype2
hantera detta
end try

motsvaras av:

on error goto catch
kod
goto noerror
catch:
if err= 1

elseif err=2

end if
noerror:

(sen är ju haskells lösning den enda riktigt rimliga, men det är ju en helt annan fråga).


Svara

Sv: Till frågan om 'On Error Go To ...'

Postades av 2010-01-04 10:11:39 - Hans Nyberg

Jag tackar för inläggen.

Att jag inte hört av mig tidigare beror på att jag flyttat från landsbygd till en stad i centrala Skåne. Tidigare var jag beroende av att E.On levererade el, vilket man inte alltid gjorde, eller att åskan inte slog ned på fälten runt bostadshuset.

På den här platsen (i ett villaområde) har det tagit mig nästan tre månader att få ett telefon- och bredbandsabonnemang genom Telias försorg att fungera på det sätt jag varit van vid.

Jag skall nu sätta mig in i vad ni skrivit men återkommer säkert med nya problem.

Mvh
Hans Nyberg


Svara

Sv:Till frågan om 'On Error Go To ...'

Postades av 2010-01-05 20:54:42 - Sven Åke Persson

Efter att ha läst Niklas inlägg noga så säger jag Fy Faen.

Det var en djävul att krångla till det.

Skall det vara så djä... svårt Phuuuuuuuuu.

Kvalificerat djä trams. Skriv program som funkar för dig och dina närmaste.

Har gjort flera prog där jag fångat fel/buggar så djä.. märkligt är det inte.

Säger igen "Kvalificerat djä... trams" Lägg dom pengarna på något bra.

VB:s Goto Error är så precis bra som egentligen behövs. mmmmmmmmmmmm.............


Svara

Nyligen

  • 19:38 Rekommendera något intressant
  • 19:13 Международная перевозка грузов
  • 00:01 DL Van Tuning | Exclusive Body Kit
  • 12:08 Indian casino
  • 04:14 Vad finns det för kratomalternativ
  • 14:16 Indian online casino
  • 14:15 Indian online casino
  • 08:28 Butiksskyltar: Hur upplever utbude

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 570 872
27 965
271 770
421
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies