2011-07-05 2 views
0

2 개의 클래스가 있습니다. 일반 데이터 액세스 클래스를 사용하면 GetDepartments 저장 프로 시저에서 부서를 가져올 수 있습니다. 내 문제는 카탈로그 액세스 클래스 및 특히 공용 정적 DataTable ExecuteSelectCommand (DbCommand 명령) (명령을 실행하고 DataTable 개체로 결과를 반환합니다) CATCH 루프 또는 쓸 방법을 내가 뭘 해야할지 모르겠다. 아무도이 부분을 완성하는데 도움이 될 수 있습니까? 아니면 Try-catch없이 어떻게 변경할 수 있습니까?trycatch 함수의 문제점

using System;  
using System.Data;  
using System.Data.Common;  
using System.Configuration;  

public static class GenericDataAccess  
{  
    static GenericDataAccess() 
    { 

    } 


    public static DataTable ExecuteSelectCommand(DbCommand command)  
    {  
    DataTable table; 

    try  
    { 

     command.Connection.Open();  
     DbDataReader reader = command.ExecuteReader();  
     table = new DataTable();   
     table.Load(reader);   
     reader.Close();   
    }  
    catch (...)  
    {  
     ...... 
    }  
    finally  
    {   
     command.Connection.Close();  
    } 

    return table;  
    } 

    public static DbCommand CreateCommand()  
    {  
    string dataProviderName = BalloonShopConfiguration.DbProviderName; 
    string connectionString = BalloonShopConfiguration.DbConnectionString; 

    DbProviderFactory factory = DbProviderFactories.GetFactory(dataProviderName);  
    DbConnection conn = factory.CreateConnection(); 

    conn.ConnectionString = connectionString; 

    DbCommand comm = conn.CreateCommand();  
    comm.CommandType = CommandType.StoredProcedure; 

    return comm; 
    } 
} 

**The Catalog Access class:** 

using System;  
using System.Data;  
using System.Data.Common; 

public static class CatalogAccess  
{  
    static CatalogAccess() 
    { 

    } 

    public static DataTable GetDepartments()  
    {  
    DbCommand comm = GenericDataAccess.CreateCommand(); 

    comm.CommandText = "GetDepartments"; 

    return GenericDataAccess.ExecuteSelectCommand(comm);  
    }  
} 
+0

무엇 ExecuteSelectCommand 메서드에서 예외가 발생하면 수행하려고합니까? 그것은 catch 블록에 들어가야 할 것이 무엇인지 지시 할 것입니다. – DoctorMick

+1

독자가 안에 있어야합니다. – Aristos

+0

연결이 비슷하게 누출 될 수 있습니다. – Constantin

답변

1

당신이해야 할 또는 catch 밖으로 떠나, 어떤 예외를 처리하지 않으려는 무엇을 알 수없는 경우. 유효한 값 :

try 
{ 
    // code here 
} 
finally 
{ 
    // cleanup here 
} 

.. 이러한 경우 모든 예외는 메소드를 호출 한 메소드에 전달됩니다. try 블록에 문제 (예외)가있는 경우 메서드가 종료되지만 finally의 코드가 실행되기 전에는 종료되지 않습니다.

+0

내가 두 번째 방법을 시도하면이 오류가 발생했습니다 '데이터베이스를 열 수 없습니다. BalloonShop'이 로그인 요청을합니다. 로그인에 실패했습니다. ' 그리고이 줄에 오류가 있습니다 "command.Connection.Open();" – dali1985

+0

@ theo1985, 아마도 사용하는 연결 문자열이 올바르지 않습니다. 올바른 데이터베이스 서버에 연결되어 있고 해당 서버에 BalloonShop 데이터베이스가 있는지 확인하십시오. – Constantin

0

무엇을 요청해야할지 모르겠다.하지만 함수에서 예외를 처리하지 않고 스택 아래로 전파하도록 (즉, 호출자가 처리하도록) 의심하고 싶다.

코드를 실현하려면 catch 절을 그대로 사용하십시오. finally 아래의 코드는 여전히 호출됩니다. 그들이가 발생 할 때 당신이 지금 처리 할 수 ​​있습니다, 또는 당신은 할 수 있습니다

catch (MyException e) 
{ 
    // Do stuff with e 
    throw; 
} 
+3

스택 추적 정보를 잃게됩니다. 더 나은 것은 단지'던짐;이다. –

+0

@Kieren : thx, 내 대답을 편집했다. – larsmoa

+0

그렇게하면 사용하지 않는 변수'e'에 대한 컴파일러 경고가 생기므로 모든 작업을 수행하려면 다시 catch하십시오. catch {throw; }'더 좋을 것이다. 또는 가독성에서 약간의 손실이 생기지 않는다면 전혀 catch 블록을 사용하지 않아도됩니다. –

0

예외 처리, 당신은 두 가지 옵션이 있습니다 : 당신이 당신의 함수에서 예외를 처리하지만, 반환하기 전에 다시 발생하려면, 시도 코드를 작성하고 나중에 처리하도록하십시오. 어느 쪽이 더 좋은가는 프로그램이 무엇을하는지에 달려 있습니다.

처리 방법 또한 코드에 따라 다릅니다. 사용자에게 알리시겠습니까? 연결을 다시 시도 하시겠습니까? 양자 모두? 아무것도하지 마라 (나쁜!)? 사용자에게 나쁜 일이 발생했음을 알리고 싶다고 가정 해 보겠습니다.

try{ 
    // breakable stuff 
}catch(Exception e){ 
    System.Windows.Forms.MessageBox.Show("Something broke: " + e.Message); 
}finally{ 
    // clean up 
} 

것은 당신이 더 업 (일명이 하나라는 방법) 예외를 처리 할 경우, 다음을 수행하십시오 : 그럼 당신은 다음과 같이 할 거라고

try{ 
    // breakable stuff 
}catch{ 
    throw; 
}finally{ 
    // clean up 
} 
+0

'catch {throw; }'는 중단 점을 넣을 줄을 제외하고는 아무 것도 추가하지 않습니다. 하지만 아마'#if DEBUG' 섹션 안에 있어야합니다. – Constantin

+0

사실,하지만 아무 것도 해치지 않으며 IMO를 사용하면 정확하게 읽을 수 있고 정확하게 무엇이 진행되고 있는지 명확하게 알 수 있습니다. –

+0

죄송합니다. '(다시 한번 말씀 드리지만, OP 코드에 대해 (다시 말하지만) 맞습니다.'catch '를 생략하면 컴파일 시간을 줄이기 위해 모든 주석을 제거하는 것만큼이나 유용합니다 : D –