---
title: "Kör finally när man kör return inuti try"
type: "forum-thread"
url: "https://www.webforum.nu/amne/dotnet/174035-kör-finally-när-man-kör-return-inuti-try"
topic: ".NET"
topic_url: "https://www.webforum.nu/amne/dotnet"
author: "Addeladde"
published: "2008-09-13T21:12:33.000Z"
updated: "2008-09-14T19:22:05.000Z"
replies: 9
views: 810
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/dotnet/174035-kör-finally-när-man-kör-return-inuti-try"
---

# Kör finally när man kör return inuti try

## #1 — Addeladde, 2008-09-13T21:12Z

Körs db.Close() i denna sats?
        

```
DBAccess db = new DBAccess()
        try
        {
            return "";
        {
        catch
        {
            return "";
        }
        finally
        {
            db.Close();
            db.Dispose();
        }
```

Permalänk: https://www.webforum.nu/p/174035

## #2 — SPiN, 2008-09-13T21:25Z

Ja.

Permalänk: https://www.webforum.nu/p/2141521

## #3 — Gladh, 2008-09-14T12:20Z

\- En sak att tänka på är att instansieringen av din DBAccess bör ligga inom try-catch eftersom det kan inträffa fel när den skall skapas.

\- Dessutom så bör du kontrollera så att db är skillt från null innan du kallar på .Dispose().

\- Close() och Dispose() skall  båda göra samma sak, så det räcker att man kallar på den ena av dem. Jag brukar alltid ta som vana att anropa på Dispose() där det finns en sådan metod, och close() när det inte finns en Dispose() metod.

\- M

Permalänk: https://www.webforum.nu/p/2141563

## #4 — nitro2k01, 2008-09-14T12:26Z

Varför skulle db.Close() köras? return betyder ju att funktionen lämnas, vilket i detta fall sker i try och catch, alltså innan finally körs. Visserligen har jag itne provkört koden, men om inte ASP är helt vrickat konstruerat borde svaret vara nej!

Permalänk: https://www.webforum.nu/p/2141564

## #5 — Phorpher, 2008-09-14T13:41Z

> **nitro2k01 skrev:**
>
> Varför skulle db.Close() köras? return betyder ju att funktionen lämnas, vilket i detta fall sker i try och catch, alltså innan finally körs. Visserligen har jag itne provkört koden, men om inte ASP är helt vrickat konstruerat borde svaret vara nej!

För att finally alltid körs oavsett om du har en return eller inte. Det är inget specifikt för ASP utan gäller i C++, Java, C#, osv.

Och för att förtydliga så kommer först return att göras och sedan kommer metoderna i finally köras.

Permalänk: https://www.webforum.nu/p/2141582

## #6 — Addeladde, 2008-09-14T13:59Z

> **Gladh skrev:**
>
> \- En sak att tänka på är att instansieringen av din DBAccess bör ligga inom try-catch eftersom det kan inträffa fel när den skall skapas.
> 
> \- Dessutom så bör du kontrollera så att db är skillt från null innan du kallar på .Dispose().
> 
> \- Close() och Dispose() skall  båda göra samma sak, så det räcker att man kallar på den ena av dem. Jag brukar alltid ta som vana att anropa på Dispose() där det finns en sådan metod, och close() när det inte finns en Dispose() metod.
> 
> \- M

Visa gärna lite exmepl på hur du brukar anroppa databaser. Om jag lägger öppningen av DB inom try satsen så kan jag ju inte stänga den i finally?

Permalänk: https://www.webforum.nu/p/2141584

## #7 — invecklaren, 2008-09-14T14:37Z

> **Addeladde skrev:**
>
> Visa gärna lite exmepl på hur du brukar anroppa databaser. Om jag lägger öppningen av DB inom try satsen så kan jag ju inte stänga den i finally?

Jo, det borde väl gå om du deklarerar variabeln utanför try/catch, men instansierar innanför?

Men Gladh har säkert bättre tips!

Permalänk: https://www.webforum.nu/p/2141589

## #8 — SPiN, 2008-09-14T16:34Z

Är det inte meningen att objekt som har Close()- samt Dispose()-metoder ska inslutas i en using-sats? Då behöver man inte tänka på såna här triviala saker.

```
using(SqlDataAdapter da = new SqlDataAdapter()) {
   ...
}
```

Man behöver alltså inte anropa da.Close() eller da.Dispose() i det här fallet.

Permalänk: https://www.webforum.nu/p/2141607

## #9 — Gladh, 2008-09-14T17:02Z

Precis som invecklaren skriver så skapar du din variable utanför try-catch, men själva instansieringen sker inom try-catch. Du måste dock sätta den till NULL i din deklaration, annars kommer kompilatorn gnälla på dig att din variabel inte är instanserad.

```

DBAccess db = null;
try
{
 db = new DBAccess;
 ...

}catch(SPECIFIK_EXCEPTION e)
{
 ...
}
finally
{
 if(db != null)
    db.Dispose();
}
```

Och precis som Spin säger så är det bättre att använda sig av using än en try-catch om det är så att du bara vill vara säker på att saker och ting stängs ner på ett korrekt sätt. Men det finns ju tillfällen då man faktiskt vill att olika saker skall ske om man får ett oväntat fel, och då måste man använd sig av try-catch...

\- M

Permalänk: https://www.webforum.nu/p/2141609

## #10 — emission, 2008-09-14T19:22Z

> **SPiN skrev:**
>
> Är det inte meningen att objekt som har Close()- samt Dispose()-metoder ska inslutas i en using-sats?

Det är inte nödvändigtvis meningen, men det är ett snyggt, tydligt och effektivt sätt. Det ersätter inte eventuellt specific catch-hantering man gör, utan motsvarar ett try-finally-block, utan catch.

```
using (DBAccess db = new DBAccess())
{ 
       //gör saker
}
```

Det förutsätter dock att DBAccess anropar Close i Dispose, eftersom det bara är Dispose som anropas i slutet av en using.

Permalänk: https://www.webforum.nu/p/2141647

---

Tråden på webben: https://www.webforum.nu/amne/dotnet/174035-kör-finally-när-man-kör-return-inuti-try
