연중 무휴 24 시간 실행해야하는 프로그램에서 예외 처리


14

처리 할 수있는 예외 만 잡아야한다는 것을 읽었으며 기본 예외 클래스 (이 경우 C #)를 잡는 것은 나쁜 생각입니다 (다른 이유로). 나는 현재까지 아직 예외가 발견되지 않은 것을 아직 보지 못한 프로젝트의 일부입니다. 그렇게하는 것은 나쁜 습관으로 여겨지지만 "이 서비스는 연중 무휴 24 시간 실행해야하므로 그렇게해야합니다."라고 대답했습니다.

연중 무휴 24 시간 실행해야하는 프로그램에서 예외를 올바르게 처리하는 방법에 대한 좋은 응답이 없었으므로 지금 여기에 있습니다. 24 시간 내내 실행해야하는 "중요한"프로그램 / 서비스에서 예외 처리를 처리하는 방법에 대한 정보 / 제안을 찾지 못했습니다. 또는 두 개이므로 중요하지 않습니다. 나는 그것이 프로그램의 정확한 본질에 달려 있음을 이해합니다. 생명을 위협하는 문제를 일으킬 수있는 프로그램의 요구 사항은 온라인 게임의 로그 스캐너와는 상당히 다릅니다.

두 가지 예 :

1 : Brittish 철도 고객을위한 자동 검색 서비스로서, 온라인으로 기차역을 검색 할 때 사용됩니다.

2 : 트랙, 기차 등의 다양한 센서에서 제공하는 실시간 정보를 기반으로 위 철도의 철도 스위치를 자동으로 제어하는 ​​프로그램.

첫 번째 프로그램은 1 ~ 2 분 동안 다운 된 경우 큰 문제를 일으키지 않을 것입니다. 후자는 인명 피해를 일으킬 수 있습니다. 각각을 다루는 방법에 대한 제안? 이 문제에 대한 추가 정보와 생각을 찾을 수있는 곳을 가리키는 포인터?


2
실시간 앱 (sic!)에서 예외 처리 중 스택 해제는 열차를 망칠 수 있습니다.
사슴 사냥꾼

4
@DeerHunter 예외없이 잘못된 코딩은 동일한 결과를 가질 수 있습니다.
BЈовић

9
알았어요 catch Exception. 그렇다고 프로그램이 작동 한다는 의미는 아닙니다. 실패로 인해 애플리케이션 상태가 계속 실행되는 동안 손상되어 훨씬 더 위험한 장소가 될 수 있습니다. 충돌 한 프로그램은 비참한 것일 수 있지만, 유효하지 않은 상태이지만 여전히 작업을 수행하는 프로그램은 적극적으로 비참한 것일 수 있습니다 .
Phoshi

1
응용 프로그램이 연중 무휴로 실행되어야하는 경우 어딘가에 무한 루프가 있으며이 무한 루프는 처리되지 않은 모든 예외를 포착하는 일부 구문을 감싸는 것이 좋습니다. 그렇지 않은 경우 처리되지 않은 예외는 main 외부에있는 기존의 catch-all 처리기와 kaboom에 적용됩니다! 24/7 응용 프로그램이 종료됩니다.
David Hammen

답변:


7

다음과 같은 특정 언어 기능

  • 가비지 콜렉션
  • 예외 시스템
  • 게으른 평가

일반적으로 실시간 시스템에는 유용하지 않습니다. 이러한 기능이없는 언어를 선택하고 최대 메모리 사용 또는 최대 응답 시간과 같은 특정 속성을 증명해야합니다.


프로그램을 지속적으로 실행해야하지만 짧고 비전 역적 인 오류가 허용되는 경우 Erlang과 유사한 전략을 사용할 수 있습니다. Erlang은 동시 기능 프로그래밍 언어입니다. 일반적으로 Erlang으로 작성된 프로그램은 서로 통신 할 수있는 여러 작업자 프로세스 (액터 모델)로 구성됩니다. 하나의 작업자 스레드에서 예외가 발생하면 다시 시작됩니다. 이것이 짧은 가동 중지 시간을 의미하지만 다른 행위자는 평소처럼 계속할 수 있습니다.

이를 요약하면 다음과 같습니다. 강력한 프로그램에서 다양한 부분이 서로 분리되어 있으며 독립적으로 다시 시작하거나 확장 할 수 있습니다.

따라서 기본적으로 다음과 같은 코드가 필요합니다.

while (true) {
  try {
    DoWork();
  }
  catch (Exception e) {
    log(e);
  }
}

그리고 루프를 종료하는 방법. 그런 루프는 각 작업자 스레드를 구동합니다.


포괄을 통해 오류를 무시할 때 발생하는 문제는 오류 원인으로 인해 프로그램의 변형이 위반되어 후속 작업이 쓸모 없을 수 있다는 것입니다. 이에 대한 좋은 해결책은 독립 근로자간에 데이터를 공유하지 않는 것입니다. 작업자를 다시 시작하면 필요한 모든 고정 변수가 다시 작성됩니다. 즉, 메시지 전송 등을 통해 서로 다르게 통신해야합니다. 배우의 상태는 다른 배우의 불변의 일부가 아닐 수 있습니다.

너무 많은 예외를 포착하는 데 따른 또 다른 문제점은 이러한 예방 조치를 취하더라도 다시 시작하여 모든 예외를 수정할 수있는 것은 아닙니다. 그렇지 않으면 메모리 부족과 같은 어려운 문제 를 다시 시작하여 처리 할 수 있습니다. 그러나 다시 시작해도 실제 케이블을 뽑을 때 인터넷 연결을 다시 얻는 데 도움이되지 않습니다.


1
그렇습니다. 그러나 "물리적 케이블을 뽑았습니다"와 같은 상황은 누군가가 케이블을 다시 넣을 때까지 예외 로그를 ​​채우고 응용 프로그램을 수동으로 다시 시작하지 않고 다시 작동하기 시작하는 상황입니다.
Mark Hurd

2

귀하의 질문에 대답하려면 예외가 무엇인지, 어떻게 작동하는지 이해해야합니다.

일반적으로 사용자의 도움이 필요한 오류가 발생하면 예외가 발생합니다. 이러한 경우 스택을 해제하고 예외를 처리하는 데 시간이 걸리지 않습니다.

catch 처리기가 없으면 프로그램이 실행을 중지합니다. 설정 및 요구 사항에 따라 허용 될 수 있습니다.

특정한 경우 :

  1. 쿼리를 실행할 수없는 경우 (예 : 잘못된 도시 이름) 사용자에게 오류를 알리고 수정하도록 요청하십시오.
  2. 중요한 센서에서 정보를 얻지 못하면 운영자가 문제를 해결하도록 요구하지 않고 계속 진행하는 것은 의미가 없습니다.

즉, 두 경우 모두 RT 프로그램에서 실행을 계속할 수없는 심각한 문제 만 나타 내기 위해 더주의하여 예외를 사용하는 것이 합리적 일 수 있습니다.


1

나는 지금까지 기본 예외 이외의 것을 발견하지 못했습니다.

예외가 적절하게 처리되지 않는 한 여기에 문제가있는 것처럼 들립니다. 적절한 시점에서 예외를 포착하고 예외 유형에 따라 적절한 조치를 취하면 훨씬 안정적인 방식으로 서비스가 실행됩니다.

서비스가 계속되어야한다면 아마도 의도 한대로 작동하는 것이 중요합니다. 예를 들어, 철도 스위치를 제어하는 ​​프로그램에서 예외가 발생하면 안전 관련 센서와 통신하는 데 문제가 있음을 나타낼 수 있습니다. 기본 예외를 발견하고 계속하면 서비스가 실행될 수 있지만 재난을 초래하는 의도 한대로 작동하지 않을 수 있습니다.

또는 센서와의 통신 장애가 발생했을 때 발생하는 예외를 포착하여 적절하게 처리하면 (예 : 영향을받는 지역의 열차를 정지) 서비스가 실행 중이며 아무도 죽이지 않았습니다.

따라서 질문을 이해함에 따라 첫 번째 경우 기본 예외 유형 처리기를 제거하는 것보다 더 구체적인 예외 처리를 추가하는 것이 좋습니다.


0

포인트 2와 관련하여 C #을 사용하지 마십시오. 그것은 실시간 언어가 아닙니다 그리고 당신은 것입니다 당신이 등을 사용하려고하면 상처를 얻는다.

포인트 1의 경우, 얼랭 방식으로 갈 수 있습니다.


내 C # 사용법과 전문 지식이 2 지점에 있지 않습니다 (실시간 트랙 전환). C #이 왜 그러한 작업에 적합하지 않은지 궁금합니다.
Michael O'Neill

1
대부분 : 가비지 수집기는 시간과 관련하여 프로그램 동작을 예측할 수 없게 만듭니다. 또한 런타임이 너무 복잡하여 이러한 상황에서 간단한 것이 필요합니다. 더 예측 가능합니다
miniBill

0

면책 조항 : 이것은 단지 생각 일뿐입니다. 경험이 없습니다.

두 번째 예제의 요구 사항을 충족시키는 프로그램은 매우 모듈화 되어야한다고 생각 합니다. 결과적으로 시스템을 불안정하게하지 않고도 모듈을 다시 시작할 수 있습니다.

예를 들어, 내부 상태에 대한 어설 션에 실패한 개체는 프로세스에서 모든 소비자와 공급 업체에게 알리면서 파기 및 재 작성할 수 있어야합니다. 보다 구체적으로, 프로그램이 철도의 스위치를 제어하고 의사 결정 루프에서 어설 션에 실패하는 경우 비상 모듈을 계속 실행할 수 있으며, 이로 인해 모든 관련 열차가 중지되고 기본 의사 결정 모듈이 다시 초기화 될 때까지 기다립니다.

보다 현실적으로, 하드웨어와 소프트웨어의 중복 -중복을 도입 할 것 입니다. 하나는 제어 시스템에 연결되고 다른 하나는 자유 실행입니다. 오류가 감지되면 시스템이 전환됩니다.

예를 들어 같은 컴퓨터에있는 두 개의 프로세스가 서로를 모니터링하고 하나가 종료되면 다른 프로세스가 다시 생성되어 상위 PID와 자체 연결을 해제합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.