유용한 오류 메시지에 대한 개발자의 문제점은 무엇입니까? [닫은]


29

오늘날까지도 전문가 팀이 제작 한 벨트 아래에서 수년 동안 사용 된 제품은 오늘날 까지도 사용자에게 유용한 오류 메시지를 제공하지 못한다 는 사실은 계속해서 놀랍습니다 . 경우에 따라 약간의 추가 정보 만 추가하면 사용자의 문제를 해결할 수 있습니다.

오류를 발생시키는 프로그램으로 인해 오류가 발생했습니다. 가능한 한 많은 정보를 사용자에게 알리기 위해 모든 것을 갖추고 있습니다. 그러나 사용자를 돕기 위해 정보를 제공하는 것이 우선 순위가 낮은 것 같습니다. 나는 이것이 큰 실패라고 생각합니다.

한 예는 SQL Server입니다. 사용중인 데이터베이스를 복원하려고 시도하면 제대로 작동하지 않습니다. SQL Server 는 액세스하는 프로세스 및 응용 프로그램을 알고 있습니다. 데이터베이스를 사용하는 프로세스에 대한 정보를 포함 할 수없는 이유는 무엇입니까? 모든 사람이 Applicatio_Name연결 문자열에 속성을 전달하는 것은 아니지만 문제의 시스템에 대한 힌트조차 도움이 될 수 있습니다.

또 다른 후보자이며 SQL Server (및 mySQL)도 멋진 string or binary data would be truncated오류 메시지와 이에 상응하는 것입니다. 많은 시간, 생성 된 SQL 문에 대한 간단한 설명과 테이블은 범인이되는 열을 보여줍니다. 항상 그런 것은 아니며 데이터베이스 엔진이 오류를 발견하면 왜 그 시간을 절약 할 수없고 어떤 열이 손상되었는지 알려줄 수없는 이유는 무엇입니까? 이 예제에서는 성능을 검사하여 성능이 저하 될 수 있으며 이는 작성자를 방해 할 수 있다고 주장 할 수 있습니다. 좋아, 내가 살께 데이터베이스 엔진이 오류가 있음을 알게되면 저장 될 값과 열 길이를 비교하여 사후에 빠른 비교를 수행하는 방법은 무엇입니까? 그런 다음 사용자에게 표시하십시오.

ASP.NET의 끔찍한 테이블 어댑터도 유죄입니다. 쿼리가 실행될 수 있으며 어딘가에 제약 조건이 위반되었다는 오류 메시지가 표시 될 수 있습니다. 고마워 개발자가 행 번호 또는 예제 데이터를 제공하기에는 너무 게으 르기 때문에 데이터 모델과 데이터베이스를 비교할 시간입니다. (기록을 위해, 나는이 데이터 액세스 방법 을 선택 하여 사용하지 않을 것입니다. 이것은 내가 상속 한 프로젝트 일뿐입니다!).

C # 또는 C ++ 코드에서 예외를 처리 할 때마다 내가 가진 모든 것을 사용자에게 제공합니다. 그것을 던지기로 결정되었으므로 더 많은 정보를 줄수록 좋습니다. 왜 내 함수에서 예외가 발생 했습니까? 무엇이 전달되었고 무엇이 예상 되었습니까? 예외 메시지 본문에 의미있는 것을 넣는 데 시간이 조금 더 걸립니다. 내 코드가 의미있는 것을 던지기 때문에 내가 개발하는 동안 나 에게 도움이되지 않습니다 .

복잡한 예외 메시지가 사용자에게 표시되어서는 안된다고 주장 할 수 있습니다. 나는 그것에 동의하지 않지만, 그것은 당신의 빌드에 따라 다른 레벨의 자세한 정보를 가짐으로써 쉽게 이의를 제기 할 수있는 주장입니다. 그럼에도 불구하고 ASP.NET 및 SQL Server 사용자는 일반적인 사용자가 아니며 문제를 더 빨리 추적 할 수 있기 때문에 자세한 정보와 자세한 정보로 가득 찬 것을 선호합니다.

개발자들이 오늘날과 시대에 오류가 발생했을 때 최소한의 정보를 제공하는 것이 좋다고 생각하는 이유는 무엇입니까?

그것은 2011 남자의 올 .


11
와우, 그것은 꽤 난폭하다.
George Marian

3
@George, 적절한 오류가 발생했을 때 실제로 더 빨리 해결할 수있는 것을 추적하는 데 오랜 시간을 보냈다고 말할 수 있습니까? :)
Moo-Juice

4
나는 심호흡, 아마도 요가와 명상을 제안합니다. :) (그것이 당신의 느낌을 정확히 알고 있습니다.)
George Marian

2
+1- "문자열 또는 이진 데이터가 잘릴 것"은 항상 나를 미치게합니다!
k25

답변:


22

잘못해서는 안되는 잘못된 오류 메시지의 예가 많이 있지만 항상보고 싶은 정보를 제공 할 수있는 것은 아니라는 점을 명심해야합니다.

너무 많은 정보를 노출하는 것에 대한 우려도 있으며, 이로 인해 개발자가주의를 기울여야 오류가 발생할 수 있습니다. (나는 말장난이 아니라고 약속하지만, 내가 그것을 알아 차린 지금 그것을 제거하지는 않는다.)

때로는 복잡한 오류 메시지가 최종 사용자에게 쓸모가 없다는 사실도 있습니다. 정보 과부하로 사이딩하는 것이 반드시 오류 메시지에 대한 좋은 접근 방식은 아닙니다. 로깅을 위해 저장하는 것이 가장 좋습니다.


+1 정보 과부하 측면에 대해서는 생각조차하지 않았습니다.
Ryan Hayes

내 게시물에서 일부 사용자가 최종 사용자에 대한 자세한 정보가 소용이 없다고 생각하는 이유를 이해할 수 있다고 설명했습니다. 그러나 API (ag ASP.NET 어댑터) 또는 데이터베이스 엔진 (SQL-Server)의 최종 사용자가 자세한 오류를 원하지 않는다고 말하는가? 시간을 잃어 버릴 수있는 시간이 있습니까? 나는 말장난을 좋아했다 :)
Moo-Juice

1
@George는 정보 과부하와 관련하여 최종 사용자에게 유용합니다. 다시 말하면 갈색 프로세서 순간을 갖지 않도록 워드 프로세서 사용자에게 전체 스택 추적을 던지지 않는 경우를 볼 수 있습니다. 인터넷을 삭제했다고 생각합니다. 그러나 로그 파일에 복잡한 정보가 포함 된 훌륭한 대안을 제공했습니다. 메시지는 이제 add For further information, see log20111701.txt입니다. 올바른 방향으로 나아가는 단계입니다.
Moo-Juice

2
@moo 궁극적으로, 내가 말하는 것은 비판하기 쉽다는 것입니다. (자주 알고 있습니다.) 그러나 오류 메시지에 얼마나 많은 정보를 포함시켜야하는지 쉽게 알 수있는 것은 아닙니다. 디버깅 중에 원래 예상했던 것보다 더 자세한 정보를 백업하고 출력해야 할 때가 많습니다. 또한 오류 메시지를 작성할 때 예상했던 것보다 유용하지 않은 경우가 많습니다.
George Marian

1
@moo 문제의 핵심은 정보가 얼마나 유용한 지 항상 명확하지 않다는 것입니다. 당신이 제공하는 예는 다소 분명해 보입니다. 그러나 일반적인 경우로 확장하는 것은 쉽지 않습니다.
George Marian

21

개발자는 오류 메시지를 작성하는 데 적합하지 않습니다.

그들은 응용 프로그램을 잘못된 각도에서 본다. 그들은 코드 내부에서 무엇이 잘못되었는지 알고 있지만, 무언가를 달성하려는 관점에서 소프트웨어에 접근하지 않는 경우가 많습니다. 결과적으로 개발자에게 중요한 정보가 반드시 사용자에게 중요한 정보는 아닙니다.


+1 많은 Framework / API 종류의 오류의 경우 라이브러리 개발자가 컨텍스트를 알 수 없다는 문제가 있습니다 . 즉, OP는 대부분 "무언가 잘못되었지만 내가 아는 곳"종류의 오류 메시지에 대해서는 언급하지 않을 것입니다. 보안 인 것 같아요?
MIA

8

자선보기 :

  • 개발자는 코드와 긴밀히 협력하여 이해하지 못한 사람을 이해하기 위해 노력했습니다. 결과적으로 그들은 오류 메시지가 훌륭 하다고 생각하지만 , 그것들을 판단 할 수있는 좋은 참조 프레임이 없습니다.

  • 지능형 오류 메시지는 실제로 수행하기가 어렵습니다. 글을 쓸뿐 아니라 잘못 될 수있는 모든 것을 해결하고, 가능성을 평가하고, 메시지를 읽는 사람에게 유용한 정보 (거의 상황에 따라 거의 다름)를 다시 제공하여 수정하도록합니다.

  • 대부분의 응용 프로그램의 경우 오류가 자주 발생하지 않기 때문에 다음 개발자는 실제로 이런 종류의 작업을 수행하기에 좋은 사례를 만들기가 어렵습니다. 또한 여분의 시간이 있다면 오류를보고하는 대신 오류를 중지하는 데 소비해서는 안됩니까?

끝없는 견해 :

  • 오류 메시지와 오류 처리가 지루하고, 작업해야 할 훨씬 더 흥미로운 것들이 있으며, 내 상사는 다음 일에 대해 내 뒤에 있습니다. 나는이 코드를 이해하고, 괜찮을 것이고, 다음 사람은 결국 그것을 해결할 것이고 그때까지 여기에서 나올 것이므로 내 문제가 아닙니다.

현실은 아마도 어딘가에 있지만, 내 경험에 따르면 실제로는 나중보다 훨씬 더 오래되었다고합니다. 기본적으로 실제로는 어려우며 아마 일어날 수없는 일을 처리하기 위해 상당한 노력이 필요합니다.


많은 최종 사용자 사례에서 귀하가 어디에서 왔는지 이해합니다. 그러나 원래 게시물에 설명 된 사례는 데이터베이스에 대한 코드를 작성하는 동안 자주 발생할 수 있습니다. 워드 프로세서 또는 컴퓨터 게임과 같은 최종 사용자 응용 프로그램과 관련하여, 나쁜 일이 일어나지 않는 한 일반적으로 오류가 발생해서는 안되며 오류가 발생하더라도 최종 사용자에게는 아무런 의미가 없습니다 ( Process Handle Raped By Spawned Injector, Quitting SYstem..... 사용자 : "wtf 내가 했습니까?`). 그러나 SQL Server / ASP.NET의 경우 더 많은 노력을 기울일 수있을 것으로 생각합니다. :)
Moo-Juice

@ Moo-Juice-전체 "오류 메시지는 어렵다"고 생각합니다. 옵티마이 저가 한 번 실제로 데이터베이스에 던져지는 것은 실제로는 당신이 던진 것과 닮은 것뿐입니다. 오류를 식별하는 것은 한 가지 일이며, 전달한 일에 대해 추적 한 것은 전혀 다른 일이 아닙니다.
Jon Hopkins

경우에 따라 사소하지 않을 수도 있습니다. 나는 string/binary data테이블의 모든 열 정보를 가져 와서 과거의 값을 검사하고 위반 한 열을 보여주는 오류를 잡는 간단한 코드 비트입니다 . 이것은 사소한 것이었다. 내 사례 예제가 사소한 일이기 때문에 너무 많이 물고있을 수도 있지만 이것이 항상 그런 것은 아니라는 것을 완전히 이해합니다. 생성 된 인젝터가 강간 프로세스에서 멈추는 방법은 어려울 수 있습니다. :)
Moo-Juice

6

불행히도, 유용한 오류 메시지는 개발자 시간과 비용이 들며 이는 회사 돈과 같습니다. 제품은 그대로 구축하기에 충분히 비쌉니다. 예, 더 유용한 오류 메시지가 있으면 좋을 것입니다. 더 유용한 오류 메시지가 포함되어야한다는 데 동의합니다. 그러나 마감일에 처해 있고 돈이 줄을 섰을 때 무언가를 잘라야한다는 것은 인생의 사실입니다. 관리자가 볼 수 있듯이 "예쁜 오류 메시지"는 가장 먼저 갈 것입니다.


아, 예, 좋은 지적입니다. 지금까지는 비용에 대한 우려가 있습니다.
George Marian

나는 비용 관점을 인정 할 수 있습니다 (그리고 그것이 그것을 좋아 해야 한다는 것을 의미하지는 않습니다 ). 나는 SQL Server 또는 ASP.NET의 개발자의 관점에서 이야기 할 수 없다,하지만 난 그것을하지 않는 것을 알고 열 이름을 제공하기 위해 많은 여분의 노력을. 간단한 예를 들어 한 시간 안에 해결할 수 있음을 인정합니다. 그런 다음 다른 1000 오류가 생성 될 수 있습니다. 그러나 그들은 적어도 일반적인 것으로 시작할 수 있습니다 :)
Moo-Juice

물론 SQL Server의 내부를 모르지만 일반적으로 말하면 오류 상황이 감지되는 시점에 해당 정보가없는 경우가 많습니다. "문자열 또는 이진 데이터"와 같은 공식은 오류 사이트에서 잘린 값이 문자열인지 숫자인지 명확하지 않음을 보여줍니다.
Ichthyo

어떤 수준에서는 이것이 유효 할 수 있지만, 단순히 $!를 추가하는 간단한 펄 스크립트에서도 같은 문제가 발생합니다. 오류 메시지에 큰 도움이 될 것입니다. 완전히 쓸모없는 '다이 "$ path를 열 수 없음"을 쓰는 것보다'다이 "$ path : $! '를 쓰는 것이 (개발자 시간의 관점에서) 저렴합니다
William Pursell

6

오류 메시지가 최대한 구체적이어야한다는 데 동의합니다.

일반적인 오류 메시지의 한 가지 이유는 아마도 오류 코드를 사용하는 것입니다. 예외를 사용할 때 오류 메시지에 필요한 모든 것을 자유롭게 전달할 수 있습니다. 리턴 코드를 사용하면 열 이름을 인코딩 할 공간이 없습니다. 아마도 오류는 컨텍스트를 모르고 단순히 오류 코드를 문자열로 변환하는 일반 함수에 의해 처리됩니다.


더 나쁜 것은 : 매우 특정한 시점에서 오류를 유발할 수 있지만, 오류 를 처리 하기 위해 여러 가지 가능성을 일련의 상황에 포함시키고 한 번의 복구로 오류를 처리해야합니다. 이 일반화 행위는 종종 부족한 추가 컨텍스트 정보를 더 많이 버려야합니다.
Ichthyo

btw ...이 메커니즘은 "모듈 dwarf678의 심각한 오류 -567 : 오류가 감지되지 않았습니다"라는 행을 따라 전체 종류의 재미있는 오류 메시지를 발생 시킵니다.
Ichthyo

4
  • 때로는 너무 많은 정보가 보안 위험이 될 수 있습니다. 누가 오류 메시지를 읽고 있는지 모른다
  • 때로는 예외를 던진 작업이 너무 복잡하여 코드의 속도 / 복잡성에 부정적인 영향을 미치지 않으면 서 의미있는 메시지를 얻는 것이 불가능합니다.

코드에서 발생하는 예외에 대한 자세한 정보를 변경할 수있는 첫 번째 요점에 답했습니다. 이 시점에서 오류가 발생하여 속도가 더 이상 결정 요인 (imho)이 아니라는 점을 감안할 때 두 번째 점은 약점입니다. 그리고 자세한 오류 메시지를 생성하기 위해 예외를 던지기 전에 성능에 영향이 필요한 경우 동의합니다. 예외가 발생한 후 해당 코드를 이동하십시오. 적절한 오류 메시지에 대한 올바른 주장으로 이러한 점 중 하나를 보지 못합니다 :)
Moo-Juice

사실, 나는 뭔가 당신이 무엇을 킵 트랙보다는 무슨 일이 있었 일단 당신이 정보를 검색 할 수 있다고 가정 할 수 있어야합니다. 그러나 중첩 루프에 있으면 인덱스 / 표시를 캡처하는 것이 문제가 될 수 있습니다.
StuperUser

동의하지 않는 첫 번째 포인트는 -1, 두 번째 포인트는 +1입니다.
Jon Hopkins

1
@jon 로그인 오류에 대한 일반적인 오류 메시지와 실제로 무엇이 잘못되었는지 알려주는보다 구체적인 오류 메시지를 대조하십시오. 예 : "사용자 이름 / 암호 조합을 찾을 수 없습니다"vs "잘못된 암호를 입력했습니다."/ "사용자 이름이 없습니다." 오류 메시지가 실제로 암호화 키를 크래킹하는 데 유용한 ASP.NET의 취약점을 기억합니다.
George Marian

@George-나는 그 예에 동의하지만 그것이 널리 퍼져 있다고는 생각하지 않습니다. 응용 프로그램에 대한 액세스 권한이 부여되면 해당 사용자가 (a) 권한이 있고 (b) 실제 응용 프로그램에서 필요한 것을 대부분 얻을 수 있다고 가정 할 때 특정 수준의 위험이 사라집니다.
Jon Hopkins

3

일반적으로 모든 오류 또는 예외 상황은 정확히 다음과 같다는 점을 고려해야합니다. 계획되고 설계된 절차를 교차 절단합니다. 작동하려는 작업 방식과 호환되지 않습니다. 그렇지 않은 경우 오류 중단으로 구제 할 필요가 없습니다.

프로그래머는이 계획된 절차의 자체 보호를 관리하도록 훈련받습니다. 따라서 우리는 가정을 검증하기 위해 정기적으로 위생 검사를 포함합니다. 이러한 위생 검사가 실패하면 계획이 어떻게 든 실패한 것입니다 ...

이러한 시스템의 작동 방식을 고려할 경우 사용자 관점에서 상식처럼 보일 수있는 요구 사항을 충족 할 수 없습니다. 체계적이고 적절한 정보가 추가 질서있는 진술서를 요구합니다 . 또한이 프리젠 테이션을 일반적인 애플리케이션 / 핸들링 디자인에 적합한 방식으로 요청하기도합니다. 분명히이 정보는 시스템 어딘가에 존재합니다. 분명히 그것은 규칙적이고 체계적인 방식으로 존재하기도합니다 (희망하기를 바랍니다). 그러나 오류가 발생한 시점에서 아무도이 정보를 사용할 수 있도록 계획하지 않았습니다. 오류는 항상 부분적인 제어 손실입니다.이러한 통제력 상실은 다양한 수준에서 발생할 수 있습니다. 런타임시 계획된 것과 다르게 작동하는 시스템 일 수 있습니다. 그러나 실제 구현은 계획된 세부 사항에서 훨씬 더 어렵고 다른 것으로 나타 났으며, 이러한 상황을 만족스럽게 처리 할 수있는 규정이 없었습니다. 이것 역시 부분적인 통제력 상실입니다.

이것을 당신이 준 구체적인 예와 관련시키기 위해 : 오류가 발생했을 때 테이블 열의 이름과 유형을 알고 필요한 공간의 길이를 알면 아무런 이유가 없습니다. 오류가 발생하지 않습니까? 상황을 수정하고 계획대로 진행할 수 있습니다. 우리가 실수를해야만한다는 사실은 문제가 잘못되었다는 것을 보여줍니다. 이러한 정보가 제공되지 않는다는 사실 은 예외 입니다.

제가 여기서 쓰고있는 것은 자명하고 상식적인 것처럼 보일 수 있습니다. 그러나 실제로는 파악하기가 매우 어렵습니다. 우리는 도덕적 범주 를 적용하여 지속적으로 이해하려고 노력 합니다. 이 모든 것은 요점을 완전히 넘어

통제력 상실의 가능성은 계획적이고 질서 정연하게 일을하고 있다는 사실에서 비롯됩니다 .


동의하지 않아야합니다. 문제가 있음을 알고 있습니다 (작업을 수행 할 수 없음). 무언가가 잘못되었음을 아는 것은 왜 그것이 잘못되었는지에 대한 지식을 나타냅니다. 이 문자열은 해당 열 (또는 해당 테이블의 열)에 따라 다릅니다. 그것은 많은 작업없이 말해. 망할 엔터프라이즈 데이터베이스 엔진입니다. 그것은 알고있다 . 그러나 그것은 그 정보를 전달하지 않습니다. 프로그래머가 데이터베이스 엔진이 동일한 작업을 수행 할 수 있음을 알게 된 후에 실행할 쿼리를 작성할 수 있다고 가정합니다. 이들은 문서화되지 않은 비밀입니다. 그냥 엉터리 오류 메시지 :)
Moo-Juice

흠 ... 당신은 논란의 여지가 아니라 논리에 근거해야합니다. 컴퓨터는 언제부터 무엇을 알고 있습니까? 이것은 할리우드 영화가 아닙니다. 프로그램은 엄격하고 사전에 정리 된 설정이며 가정이 깨지면 통제력을 잃게됩니다. 정말 이해하기 어려운가요? 컴퓨터가 나던 이해 프로그램을 때, 그리고 그가는 잘못 그래서 그는 이해할 수 없습니다. 거의 모든 일관성 검사가 트리거 될 때 실행은 이미 수천 개의 문으로 진행되었으며 아무도 어떤 데이터가 이미 손상되었는지 알 수 없습니다. 당신이 할 수있는 일은 피해를 제한하는 것입니다
Ichthyo

2

소프트웨어 회사의 지원 엔지니어로 일하며 종종 새로운 오류 메시지가 나타납니다. 자주 개발팀에 문의 할 때 응용 프로그램 소스에서 메시지를 검색해야합니다.

사용자에게 제공되지 않았더라도 개발자 팀이 새 메시지를 추가 할 때마다 오류 메시지 색인 문서 또는 데이터베이스에 메모를 추가하면 많은 시간이 안전하다고 생각됩니다. 고객 문제의 원인을 찾고 시간을 절약 할 수있는 훨씬 빠른 속도 ...


1
죄송합니다. 실용적이지 않습니다. 인덱스 문서를 정확하게 관리하기 위해 누가 인덱스 문서를 관리해야합니까? 작성된 문서가 코드와 별개이므로, 구식이되어서 바로 그 순간에 새로운 오류의 소스를 얻기 시작합니다.
Ichthyo

반대로, 각 오류에 고유 번호가 있고 각 설명이 (특별히 형식화 된) 주석의 형태로 또는 끈. 따라서 문서는 각 빌드마다 자동으로 생성됩니다. 추출 된 메시지는 최종 사용자가보고 싶어하는 것보다 훨씬 더 자세 할 수 있습니다. 나쁜 생각이 아닙니다!
Jeanne Pindar

많은 런타임 시스템이 줄 번호 나 유사한 정보를 기록 할 수 있습니다. 불행히도 이것은 원래 문제에 도움이되지 않습니다. 이렇게하면 예외가 감지 된 위치를 알 수 있지만 무엇이 잘못되었는지 알 수 없기 때문 입니다. 후자를 찾는 것을 디버깅 이라고합니다 . 실제로 이것은 다소 지루하고 작업 집약적 인 작업입니다.
Ichthyo

@Jeanne과 함께합니다. 코드에 통합하거나 오류 코드와 해석이있는 코드의 중앙 색인을 가질 정도로 간단합니다. 일단 예외가 탐지 된 곳을 알고 나면 코드에서 추적해야하는 것이 아니라 어딘가에 환경에 문제가 있음을 알려주기에 충분할 수 있습니다.
glenatron

2

당신이보고있는 문제는 실제로 적절한 캡슐화와 정보 숨기기의 부작용 중 하나입니다.

현대 시스템은 매우 복잡합니다. 일반 개발자가 특정 작업을 코딩하는 동안 UI에서 원시 바이너리까지 전체 시스템의 정신 모델을 머리 속에 담을 수있는 가능성은 거의 없습니다.

따라서 개발자가 앉아서 데이터베이스 파일을 복원하는 비트를 코딩하는 동안 그의 정신 모델은 데이터베이스 파일 복원 작업을 둘러싼 비트로 완전히 채워져 있습니다. 그는 파일을 읽고, 속성을 확인하고, 버전을 읽고, 기존 데이터를 백업하고, 병합 / 덮어 쓰기 전략을 선택하는 등의 작업을 수행해야합니다 (물론 추측합니다. UI를 고려하면 예외 처리기에 쓰는 오류 문자열에 있습니다. 다음과 같은 것 :

catch (IOException error)
{
//File is in use
throw new GenericExceptionParsedByTheUIThread("File is in use.");
}

이 예제에서 파일을 사용하고 있거나 DB의 다른 스레드를 사용하는 프로세스와 관련하여 도움이되는 유용한 정보는 프로그래밍 방식으로 완전히 범위를 벗어납니다. DB 파일을 다루는 수백 개의 클래스가있을 수 있습니다. 파일을 사용하여 파일 시스템에 액세스하고 실행중인 다른 프로세스 (이 프로세스가이 시스템에 있다고 가정)를 사용하여 다른 모든 프로세스에 대한 정보를 해당 클래스로 가져 오면 새는 추상화가 발생합니다 . 생산성에는 직접적인 비용이 있습니다.

이것이 오늘날 이런 종류의 오류가 지속될 수있는 방법입니다. 분명히, 그들은 모두 고정되어야한다. 그러나 많은 경우에 생각보다 많은 오버 헤드가 있습니다 (예를 들어,이 기능을 사용하려면 원격 시스템이이 데이터베이스 파일을 원격 시스템에서 사용 중인지 확인하기 위해 네트워크 연결 및 공유 열거를 통과해야 할 수도 있습니다) 이유) 그리고 비용은 사소하지 않습니다.


@ GWLlosa, 이것은 훌륭한 답변이며 고려하지 않은 것입니다. 그것은 (그리고 여기에 전체 코드 예제를 제공 할 수는 없습니다.) IOException을 얻을 때 내 던지기 전에 GenericException1) Processes하위 시스템에 프로세스 목록을 요청하십시오 . 2) 각 프로세스에 사용중인 데이터베이스를 물어보십시오. 3) 덮어 쓰려는 데이터베이스에 지정된 데이터베이스와 프로세스를 일치시킵니다 DatabaseInUse(dbName, processName, applicationName. 4) 예외 가 발생합니다. :)
Moo-Juice

1
확실히 가능하다. 그러나 DB를 프로세스 (특히 네트워크를 통해)에 일치시키는 코드는 복잡하고 느리게 / 오류가 발생하기 쉬울 수 있습니다. 이로 인해 약간의 좌절감이 생길 수 있습니다. % file !!!! 네트워크 공유에 액세스 할 수없는 이유는 무엇입니까
???

1
@ Moo-Juice : 당신이 제안하는 것은 순진하게 들립니다. 데이터베이스와 같은 대규모 멀티 스레드 환경에서는 "all xyz"목록을 얻기 위해 일부 글로벌 서비스를 이용할 수 없습니다. 다른 스레드에서 다른 서비스와 대화하기 위해 잠금이 필요합니다. 이로 인해 전체 시스템의 교착 상태가 악화되거나 다른 데이터가 손상되거나 추가 오류가 발생할 수 있습니다. ....
Ichthyo

1
이 예제는 실제로 매우 유익합니다. 일반적으로 이러한 catch 핸들러에서는 try 블록의 어느 부분이 실패 했는지 (일반적으로 IOException을 일으킬 수있는 여러 부분이 있음) 알 수 없습니다. 그 외에도 해당 위치에서 파일 이름을 알 수 없으므로이 파일에 해당하는 논리 테이블을 알 수 없습니다.
Ichthyo

@ Ichthyo, 공격은 없지만 전혀 순진하다고 생각하지 않습니다. 데이터베이스 프로세스를 여전히 처리하여 데이터베이스에 대한 핸들이있는 프로세스를 알려주기 위해 데이터베이스 엔진을 요청하지 않습니다. 기업 전체를 중단 시키라고 요구하지는 않습니다. 간단한 대답이 필요하면 데이터베이스 서버의 근본적인 디자인 결함을 먼저 보여줍니다. 이 정보는 가능한 가장 빠른 방법으로 관련 정보를 제공하도록 설계되어야합니다. 질문 "누구?" :)
Moo-Juice

2

내가 가장 좋아하는 것은 Univac Fortran IV 컴파일러였습니다 (70 년대 후반). 비 숫자를 읽을 때 충실하게 발표했습니다.

의미없는 데이터의 해석이 시도되었습니다


+1, 절대적으로 환상적입니다! 피지에서 포기하고 닭을 키우고 싶게 만드는 것은 일종의 오류입니다.
Moo-Juice

실제로이 오류 메시지는 100 % 정확합니다. 더 많은 conetxt를 사용하여보다 친숙한 메시지를 원할 경우 약간의 추측과 휴리스틱을 작성해야합니다. 이 방법으로 오해소지있는 오류 메시지 를 추가 할 수 있습니다 .
Ichthyo

0

나는 대부분의 오류 메시지가 실제로 프로그래머 (자체) 지향의 영광스러운 디버깅 코드 / printf 문이라고 생각합니다.

사용자 지향 오류 메시지를 작성한다는 것은 사용자가 누구인지 알고 자신이 알고 싶은 것을 예상한다는 것을 의미합니다. 코드를 작성하는 동안 개발자는 현재 작성중인 코드를 디버깅하거나 알려진 사용 또는 우세한 사용 사례에 유용한 오류 메시지를 작성하는 데 더 적합합니다.

코드 작성에서 사용자 인터페이스 (또는 사용자 경험)의 텍스트 부분 디자인으로 전환하는 것은 컨텍스트 전환입니다. 다국어 응용 프로그램과 같은 대규모 응용 프로그램에서는 개발자가 완전히 처리하지 않고 다른 사람이나 팀 (UI, 번역)에게 전달할 수 있으므로 개발자가 메시지의 내용을 신중하게 설명하지 않는 한 중요한 세부 정보가있을 수 있습니다. 쉽게 잃어 버렸습니다.

물론, 오류 및 예외가 처리 (즉, 포착)되는 한 오류 처리를 점검하고 확인하는 것이 우선 순위가 낮은 것으로 간주되는 경우가 많지만 강조하지는 않습니다. 오류 조건에 종종 부정적 의미 (예 : 실수 또는 실패)가 있기 때문에 개발자 또는 QA가 평가할 수있는 것은 코드베이스에서 정신적으로 보람이없는 장소입니다.


0

그 이유는 오류보고 / 처리가 항상 사후 생각으로 수행되기 때문 이라고 생각 합니다. 그들이 완전히 생각한 후에도, 그들은 전체 디자인에서 대부분 2 급 시민입니다.

최신 소프트웨어는 일반적으로 여러 계층으로 구성됩니다. 너무 많은 생각없이 오류보고 논리를 서두르면 유용한 오류 메시지를 표시하는 데 필요한 모든 정보 를 수집하기가 어려운 경우가 많습니다 .

예를 들어, 백엔드에서 오류가 발생하지만 종합적인 오류 메시지를 작성하려면 상위 계층의 일부 정보가 필요합니다. 가장 좋은 오류 메시지는 거의 모든 계층의 정보가 필요합니다 (시스템에서 발생한 상황에 대한 포괄적 인보기를 제공하기 위해). 이상적인 오류 메시지는 다음과 같습니다. "처음에 문자열을받은 다음 파서를 통과하여 재미있는 것을 제공했습니다. 여기를보고 싶을 수도 있습니다.

설계 단계에서 오류보고 메커니즘이 일류 시민이 아닌 경우 종종 불필요한 커플 링이 필요합니다. 나는 대부분의 사람들이 인상적이지 않은 무언가를 위해 너무 많은 일을한다고 생각한다. ( "누구? 내 프로그램이 추락하고 오류 메시지가 유용하다!"

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