2013-10-24 1 views
2

다른 사람들이 사용하게 될 ROS 노드를 프로그래밍하고 있으므로 공통된 지침을 따르고 싶습니다. 때로는 예외에 추가 정보를 추가하고 싶지만 어떻게해야할지 모르겠습니다. 다음은 유용 할 곳의 예입니다.C++ "예외적 인"예외 처리 방법

내 ROS 노드가 부스트 라이브러리를 사용하여 직렬 장치에 연결됩니다. 리눅스에서는 예를 들어/dev/ttyUSB0에 권한을 설정해야합니다. 그렇지 않으면 부스트가 직렬 연결을 열고 프로그램을 종료 할 수 없습니다. 나는 문제가 무엇인지, 내가 추가 정보를 사용자의 provice 할다시피

terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error> >' 
what(): open: Permission denied 
Aborted (core dumped) 

:

다음은 콘솔에서 복사 한 예외 메시지입니다. 그래서 try/catch 블록을 사용하여 문제를 일으키는 줄을 감쌌다.

try{ 
    serial = new boost::asio::serial_port (io, port); 
} 
catch(const std::exception& e) 
{ 
    cerr << "EXCEPTION CAUGHT: Boost::asio::serial_port could not open a connection. Make sure that you have read/write access to the serial port (run: sudo chmod a+rw /dev/ttyUSB0)" << endl; 
    cerr << endl << "Original exception:" << endl; 
    throw; 
} 

이 상황을 처리하는 것은 좋은 방법일까요? 미리 감사드립니다.

+2

제 생각에는 엄밀히 말하자면 가능한 한 빨리 예외를 다루지 만 이전에는 그렇지 않습니다. 그 장소에서 오류 정보를 인쇄하는 것은 좋지 않을 수 있습니다. 예를 들어 여러 개의 직렬 어댑터를 사용할 수 있고 모든 어댑터를 시도하려는 상황을 생각해보십시오. 귀하의 기능은 오도 된 정보를 인쇄합니다. 대신 사용자 정의 유형을 만들거나 해당 위치에 추가 정보 (예 : Boost.Exception 사용)를 추가하고 나중에 오류 메시지를 출력하십시오. 귀하의 메인() 또는 그 오류에서 복구 할 수있는 장소에서. –

답변

2

이 상황을 처리하는 것이 좋든 나쁘지 않습니까?

응용 프로그램의 기능과 흐름을 아는 사람 만 알 수 있습니다. (귀하의 경우에 적용되지 않을 수도 있습니다)

몇 가지 가이드 라인 :

  1. 캐치 (@Johny가 언급 한 바와 같이, boost::system::system_error 시도) 귀하의 케이스를 다루는 대부분의 전문 예외입니다.

  2. 예외를 포착 할 때 메시지를 인쇄하는 경우 e.what()도 인쇄하십시오. 어떤 경우에는 읽기 권한과 관련된 이유와 다른 이유 (즉,/dev/ttyUSB0가없는 경우)가 boost::system::system_error이 될 수 있습니다. e.what()을 인쇄하지 않으면 실제 오류 원인을 잃어 버리고 권한 문제로 잘못 식별하게됩니다.

  3. 또한 boost::system::system_error을 사용하는 경우 e.code()를 인쇄하십시오. 이것은 실제 (시스템 레벨) 오류 코드를 제공하여 오류 원인을보다 정확하게 식별합니다.

  4. 이 오류에서 복구 할 수있는 경우 throw;을 추가로 실행하지 마십시오. 그렇게하면 애플리케이션에 terminate()이 표시되지 않습니다.

+0

그래, 던져서 원래의 예외를 인쇄하고 있는데, 이렇게하는 것이 좋지 않은 것처럼 보입니다 :) 조언 해 주셔서 감사합니다. – Cat

4

모든 std :: exceptions를 잡고 있습니다. 나는 boost::system::system_error 예외 만 잡아야한다고 생각합니다.

그렇지 않으면 잘못된 오류 보고서 (예 : 할당 실패의 경우 std::bad_alloc)를 인쇄 할 수 있습니다.

+0

네, 고맙습니다. 저의 문제 중 하나가 해결되었습니다. – Cat

관련 문제