2013-04-08 4 views
4

, C# 및 C++에서 아무도 new 연산자에 예외 처리를 사용하지 않습니다. 그 이유는 무엇입니까? 전화가 항상 성공할 것이라고 보장됩니까?새 작업을 사용할 때 try catch를 추가하지 않는 이유

+0

메모리 부족 예외를 생성 할 수 없습니다? 성공을 보장하지 않습니다. 나는 변수가 값을 할당 받았는지 아니면 여전히 NULL인지 테스트가 믿는다. –

+1

'OutOfMemoryException'을 던질 수는 있지만 다루는 것은 어렵습니다. 그래서 저는 그것을 최상위 레벨 처리자에게 남겨두고기도합니다. – CodesInChaos

+0

그래서 예외가 호출을 실패한 것을 잡기 위해 더 높은 레벨로 버블 링을 유지하거나 체인을 처리하지 않으면 치명적인 오류가됩니다. –

답변

9

통화가 항상 성공적으로 이루어 지도록 보장됩니까?

아니요, 이것은 보장 할 수 없습니다.

일반적으로 실제로 뭔가 할 수있는 예외를 처리하는 것은 좋은 생각입니다. 규범에 따라, 예외를 최소화 할 수있는 방법으로 개체 구성을 설계하는 것이 좋습니다. 즉, 항상 가능한 것은 아니며 대부분의 경우 new Foo()을 호출하면 쉽게 catch 할 수있는 예외가 발생할 수 있습니다. 이 작업을 수행하려고하면

예를 들어,이 이상 (심지어 gcAllowVeryLargeObjects 세트) 단일 차원의 배열에 허용되는 최대 항목 수보다 같이 예외를 발생 보장하고 있습니다 :

var willCauseException = new double[int.MaxValue]; 
+0

주요 언어가 코드가 가능한 해결할 수없는 예외를 처리하는 관용구를 제공하지 않는다는 것은 너무 나쁘다. 잡아라. 그리고 rethrow 다소 일종의 일하지만, 그것은 칙칙한. 예외를 해결할 수있는 코드를 위해'catch '를 예약 할 수 있다면 더 좋을 것입니다. 그리고 다른 블록 타입 (e.e.예외를 해석 할 수 없지만 그것을 바탕으로 행동을 취해야한다는 것을 알고있는 코드에 대해'fault (Exception ex)'또는'finally (Exception ex)'를 사용할 수 있습니다. – supercat

4

글쎄, 아무도은 강한 표현입니다. 사실, 산업 수준의 응용 프로그램은 이러한 오류를 확인해야합니다. 그러나 이것이 오류가 검사되어야 함을 의미하지는 않습니다. 모든 곳.

new을 사용하여 개체를 만들려고하면 생성자 자체에서 발생할 수있는 메모리 외에도 std::bad_alloc 또는 OutOfMemoryException (사용자 언어에 따라 다름)을 발생시킬 수 있습니다. 하지만이 예외를 발견하면 어떻게해야할까요? 할 일은 중앙 집중식 장소 (아마도 응용 프로그램의 메인 루프)에서 이러한 예외를 잡아서 거기에서 처리하는 것입니다. "메모리가 부족합니다. 현재 작업을 저장하고 응용 프로그램을 종료하십시오"라는 메시지 중 하나가 나타날 때마다 이러한 예외 중 하나가 발견되어 처리됩니다 (일반적으로 응급 상황을 해제하여 정상적인 종료를 허용 한 후 사용자에게 경고하는 메모리 블록).

예외 관리는 모든 곳에서 try-catch 블록을 작성하는 것으로 구성되지 않습니다. 올바른 위치에만 존재해야하며 나머지 코드는 예외가 발생할 수 있고 시스템 상태가 항상 복구 가능한 상태로 유지되어야한다는 점을 고려하여 작성되어야합니다.

관련 문제