1

자문이 필요합니다. 내 소스 애플리케이션이 매우 확장됩니다. 그리고 약간의 문제, 예외 등을 다루고 있습니다.예외, 오류 및 반환 값을 처리 할 때의 문제

예를 들어, "DatabaseProvider"클래스에는 db와 접촉 할 수있는 메소드가 있습니다. 표준 예외, 잘못된 데이터 형식 데이터베이스 (예 : 잘못된 전자 메일 형식), 데이터베이스에서 반환 된 오류를 처리해야합니다. 이 모든 것들은 DatabaseProvider의 메서드를 호출 한 함수로 돌아 가야하므로 메서드는이 예외 나 오류를 기록하고 계속 작동합니다. 그래서 나는 예외를 던질 수 없다.

그리고 충분하지 않다면 대부분의 경우 또는 개체 또는 개체 목록에서 값을 반환해야합니다 (DatabaseProvider에서).

그래서 "Response"클래스를 만들었습니다. 그리고 그 클래스의 객체는 내 응용 프로그램의 모든 메소드에서 반환됩니다. 그런

Sth를 :

public class Response 
{ 
    public bool Error { get; set; } 
    public string ErrorMessage { get; set; }   
    public bool DatabaseError { get; set; } 
    public string DatabaseMessage { get; set; } 

    public Exception ex { get; set; } 
} 

그러나 방법 (예를 들어) 반환 같은 시간에 자체 디자인 개체의 목록?

"out"매개 변수를 사용하는 것이 해결책입니까? 가장 좋은 방법은 무엇입니까 (모범 사례)? 나는 그것에 대해 조사하고 있었지만, 예외를 처리하는 방법 만 찾았다. (0123).

+1

사용자 정의 예외를 구현하지 않으려는 이유가 있습니까?무언가 잘못되었을 때가 아니라 항상이 정보를 반환하겠다는 귀하의 목표입니까? 귀하의 예제에서 그것은 매우 오류 중심으로 보입니다. –

답변

3

이 정보를 반환하는 대신 던지고 잡을 수있는 사용자 정의 예외를 구현하는 것이 좋습니다. 매우 오류 관련. , 귀하의 의견을 바탕으로 :

abstract class ResultWrapper 
{ 
    //meta info, such as error references/properties/flags/statistics 

    public ResultWrapper([meta info]) 
    { 
     //set meta info 
    } 
} 

class ResultList<T> : ResultWrapper 
{ 
    public readonly List<T> resultList; 

    //constructor for resultList, plus meta information for parent 
    public ResultList(List<T> resultList, [additional args for meta info]) : base([meta info]) 
    { 
     this.resultList = resultList; 
    } 
} 

class SingleResult<T> : ResultWrapper 
{ 
    public readonly T result; 

    //constructor similar to above 
} 

편집 : 당신은 항상 반환 된 결과에 특정 메타 정보를 첨부 할 경우

그러나, 당신은 메타 정보를 운반하는 동안 결과를 감싸는 작은 차량 클래스를 구현할 수 당신은 당신이 던질 수있는 커스텀 예외 (custom wrapping exceptions)를 반드시 가져야한다. Petar가 말했듯이, 이들은 루프 내에서 잡힐 수 있으며 후속 작업의 실행을 중단하지 않고 처리 할 수 ​​있습니다. 이 언어는 좋은 이유로 예외 처리를 지원합니다. 참고하시기 바랍니다 귀하의 패턴 또한

, 상기 bool에 대한 필요가 없습니다

public bool Error { get; set; } 
public string ErrorMessage { get; set; } 

. 오류 메시지/참조 필드에서 null이 아닌지 확인하십시오.

+0

글쎄, 그것은 예외를 던지지 않는 것이 아닙니다. 하지만 오류가 발생하면 로그를 기록하지만 여전히 값을 반환합니다. 그리고 두 번째 이유는 타이머 루프의 문제입니다 (필자는 Petar Ivanov의 답변에 – Marshall

+0

에 대한 답변을주었습니다. 메타 정보로 값을 반환하는 것이 좋은 프로그래밍 방법인가요? 인기가 있습니까? 매우 좋지만 매우 사용된다면 드물게 좋은 솔루션이 아닙니다. 다시 생각해야합니다. – Marshall

+0

@ 마샬은 위의 편집을 참조하십시오. –

4

예외 상황에서 전달해야하는 모든 데이터가 포함 된 사용자 정의 예외를 구현합니다. 비슷한 것

public class MySpecificException: Exception 
{ 
    public bool Error { get; set; } 
    public string ErrorMessage { get; set; }   
    public bool DatabaseError { get; set; } 
    public string DatabaseMessage { get; set; } 

    public Exception ex { get; set; } 
} 

예외를 발생시키고 호출 기능에서 특정 예외에 대한 try catch 블록을 사용합니다.

public void CallingFunction() 
{ 
    try { 
     //call your function 
    } 
    catch (MySpecificException ex) 
    { 
     //log the data from the exception 
    } 

그건 정확히 맞춤 예외가 무엇입니까.

이 방법을 사용하면 반환 할 항목 (목록 또는 기타)을 함수에서 반환 할 수 있습니다.

+0

알아요,하지만 아직 확실하지 않습니다. 나는 많은 작업을 얻는 타이머 루프를 가지고 있으며 하나씩 실행한다. 자, 임의의 작업이 실패 할 때 -> 나는 예외를 던집니다. 예외는 타이머 틱을 중단하고 대기열의 나머지 작업은 실행되지 않습니다. 단일 작업이 실패하면 해당 작업을 기록하려고합니다. 나머지 작업은 계속 진행합니다. 무슨 일이 있었는지에 대해 everythink를 기록하고 싶습니다. – Marshall

+0

음, 호출자 함수에서 예외를 잡았습니다 - 아무 것도 중단됩니다 :) –

+0

그래서 전체 타이머 루프는 try catch (Exception ex)에 있습니다. 내부에는 또 다른 try catch (MyException myex) 블록이 있지만이 초 안에는 "Execute"함수 만있을 것입니다. catch (MyException myex)에서 - 실패 할 경우 모든 항목을 기록합니다. 나는 그것에 대해 다시 한번 생각해야한다. 그러나 그것은 좋게 들린다. – Marshall