2016-10-26 2 views
3

나는 사용자 코드에서 파생 된 예외를 throw System.SystemException 중 하나를 throw하는 것은 나쁜 습관인데, 사용자 코드는 응용 프로그램 예외 만 throw해야한다는 것을 기억합니다.OutOfMemoryException 응용 프로그램 코드에서 좋은 디자인을 던지고있다

우리는 GPU를 사용하는 네이티브 라이브러리를 가지고 있습니다. GPU 메모리가 부족하다는 오류 코드를 반환 할 수 있습니다. 이 오류 코드를 .Net 예외로 변환하려고합니다. appropiate 텍스트 (InvalidOperationException이 기준)

  • 사용자 정의 예외
  • 하나 인 최고의와

    1. System.OutOfMemoryException
    2. System.InvalidOperationException :

      내가 생각할 수있는 가능한 예외 왜?

    +0

    3 아주 좋은 답변 @ 그가 최소한의 점수를 가졌던 것에 따라 게오르그 사람은 ... – sanosdole

    답변

    1

    높이기는 OutOfMemoryException입니다. 그 이유는이 예외가 일반적인 경우에서 복구가 거의 불가능하고 클라이언트의 경우 시스템이 메모리가 부족했는지 또는이 예외 유형을 남용했는지를 판별하기가 매우 어렵다는 것입니다. 특히 클라이언트가 이 동작을 기대하십시오.

    클라이언트가 처리 할 수 ​​있기 때문에 InvalidOperationException을 발생시키는 것이 더 좋습니다 (다른 곳으로 계산을 오프로드하거나 CPU에 필요한 항목을 수행하여 잠재적으로 다른 라이브러리 사용). 그러나 예외가 InvalidOperationException 인 경우이 예외 유형은 다른 라이브러리에서도 사용되거나 BCL에서 사용됩니다. 따라서 클라이언트는 신뢰할 수없는 오류 메시지를 구문 분석하여이 예외에 대응해야합니다.

    따라서 최상의 솔루션은 사용자 지정 예외 유형입니다. 클라이언트가이 예외 유형을 catch하고이 상황에서 복구하거나 사용자에게 문제를 알릴 수 있기 때문입니다. 이것이 잘못된 조작의 특별한 경우라고 생각하는지 여부는 귀하에게 달려 있습니다. 개인적으로 예외는 InvalidOperationException에서 상속 받지만, Exception에서는 직접 상속하지 않습니다.

    3

    투척 System.OutOfMemoryException은 이상적인 선택이 아닙니다. 라이브러리를 사용하는 프로그래머는 불필요한 객체 중 일부를 메모리에서 제거하고 다시 시도하여 System.OutOfMemoryException에 반응 할 수 있습니다. 그러나, 귀하의 경우에는 시스템 메모리가 아닌 GPU 메모리이므로 시도가 제대로 작동하지 않습니다.

    사용자가 GPU 메모리에서 직접 또는 간접적으로 언로드 할 수있는 옵션이있는 경우 사용자 지정 예외 접근법 (3 번)이 가장 깨끗한 선택을 제공합니다. 사용자가 제어 할 수없는 경우, 즉 예외적으로 기본적으로 '죽었습니다'라는 메시지 인 경우 System.InvalidOperationException도 좋은 선택입니다.

    1

    유익, 그래서 후보에 대해 살펴 보자해야 슬로우 예외 :

    System.OutOfMemoryException 
    

    https://msdn.microsoft.com/en-us/library/system.outofmemoryexception(v=vs.110).aspx

    에서 OutOfMemoryException 예외가 두 가지 주요 원인 : 당신은 확장하려는

    • StringBuilder.MaxCapacity 속성으로 정의 된 길이를 초과하는 StringBuilder 객체입니다.
    • 공용 언어 런타임에서 작업을 성공적으로 수행하기에 충분한 연속 메모리를 할당 할 수 없습니다. 메모리 할당이 필요한 속성 할당 또는 메서드 호출에 의해 throw 된 이 예외가 될 수 있습니다. OutOfMemoryException 예외의 원인에 대한 자세한 내용은 "메모리 부족"이 실제 메모리를 참조하지 않는 것을 참조하십시오.

    이를 읽고서 나는 System.OutOfMemoryException 매우 잘못 후보라고 생각합니다 : 그것은 오도 귀하의 경우 문제가 GPU하지와 RAM 함께 때문이다.

    제 candiadate는

    System.InvalidOperationException 
    

    https://msdn.microsoft.com/en-us/library/system.invalidoperationexception(v=vs.110).aspx

    메소드 호출은 객체의 현재 상태에 대해 무효 인 경우에 발생되는 예외이다.

    또 다른 미스; 상태는 괜찮습니다. 충분한 메모리가없는 GPU입니다. 그래서

    난 당신이 정의 예외이있는, 그러나 System.InvalidOperationException을에 기초하지만, 추상적 인 GpuException를 통해 Exception에없는 자신의 구현 제안 : 내가 선택 : 매우 짧은 시간에

    Exception 
        GpuException    // Abstract (wrong GPU, lack of support etc.) 
         GpuOutOfMemoryException // Not enough memory on board 
    
    관련 문제