2010-12-14 3 views
4

나는 C#에서 로그인 클래스를 작성 중이며, 널 (null) 암호, 불충분 한 암호 문자 등에 대한 예외 사항을 던지려고 부지런히 노력하고있다. 갑자기 나에게 일어난 일은 -이 예외로 무엇을해야 하는가? 그들은 무엇을 위해서입니까? 예외 처리 여부와 상관없이 앱은 여전히 ​​그 시점에서 실패합니다. 다른 개발자 인 고객은 예외입니까?예외를 던지는 점은 무엇입니까?

+1

[예외 또는 오류 코드] 가능한 복제본 (http://stackoverflow.com/questions/253314/exceptions-or-error-codes) –

+4

중복으로 볼 수 없습니다. 이 질문은 '왜 그렇습니까?' 그 질문은 '어떻게해야합니까?' 그것은 매우 비슷합니다. – jcollum

답변

6

예외는 특정 오류의 원인에 대한 자세한 정보를 제공하는 데 사용됩니다. 코드 자체만으로 실패하게 만든다면 실패의 실제 원인에 대해 더 자세한 정보를 제공 할 수있는 기회를 놓치게됩니다.

사용자가 예외에 추가하는 정보를 보지 않아야합니다. 대신 자세한 예외를 포착하고 정보를 기록한 다음 사용자에게 친숙한 오류 메시지를 표시하는 전역 예외 처리기를 추가하는 것이 좋습니다.

예외는 로그에 오류가 발생한 이유 (예 : 암호가 null 임)에 대한 자세한 메시지를 제공 할뿐만 아니라 예외를 초래 한 호출 체인을 나타내는 호출 스택 정보도 제공합니다. 로그인 양식에서는 덜 중요합니다. 그러나 다중 스레드 비동기 클라이언트/서버 응용 프로그램에서는 이것이 중요 할 수 있습니다. 그들은 (고객이) 나쁜 짓을 보여주는 http://msdn.microsoft.com/en-us/library/ms229005.aspx

0

예외는 발신자에게 일종의 오류를 알리는 코드입니다. 호출 코드는 오류 메시지를 표시하고, 예외를 억제하고 정상적으로 저하시키는 것과 같이 원하는대로 할 수 있습니다.

6

예외를 작성하는 사람이라면 아무 것도하지 않아야합니다.

예외는 제대로 복구 할 수없는 무언가가 잘못되었다는 사실을 고객에게 알리는 방법입니다. 당신은 그들에게 문제를 해결할 수있는 기회를 주거나, 오류를 기록하거나, Exception을 통해 유용한 일을 할 수있을 때까지 체인을 넘겨 줄 수 있습니다.

+2

그건 이상한 방법입니다. 많은 사람들이 수업과 고객 모두를 작성하게됩니다! –

+6

@ André Caron 그것이 사실이지만, 당신은 모자를 바꿀 수 있어야합니다. 당신이 방법을 쓰고있을 때 당신은 그 방법의 클라이언트가 아닙니다. 나중에 클라이언트 코드를 작성할 때 메소드의 세부 사항에 대해서만 신경 쓰지 않아도됩니다. –

+0

그렇다면 예외는 일반적으로 더 낮은 레벨에서 발생하지만 예외적으로 체인 위로 올라가는 방식으로 관리되어야하며 응용 프로그램은 계속 작동해야합니까? – hoakey

1

요약하면 요점은 실제로 일어나지 않아야하는 것이 실제로 발생했음을 나타 내기위한 것입니다.

+0

나는이 오류 메시지를 VS 예외 토론에서 자주 듣고 있으며, 한번도 좋은 논쟁처럼 보지 못했습니다. "일어나지 말았어야한다"는 논쟁의 대상이다. –

+0

예외는 던지고 취급하는 것이 비싸 - 잘 디자인 된 체계는 예외를 일으키는 원인이 될 수있는 활동을 수행하기 전에 조건이 충족되는지 확인합니다. 예외가 발생해서는 안된다는 말은 아니지만, 상황이 잘못되거나 예기치 않은 상황이 발생할 경우를 대비하여 예약해야합니다. – STW

+0

STW @ 그런 경우 실패가 아니므로 null 암호에 대한 예외를 throw하지 않을 수 있습니까? – hoakey

3

추상화의 다음 단계로 문제가 있음을 알리고 문제를 설명하기 위해 논리 흐름을 변경합니다.

3

예외 자체로 향후 더 큰 문제를 방지 할 수 있습니다. 어떤 일이 발생하지 않았다는 것을 알았을 때 아무 것도하지 않았 으면 코드를 호출하는 프로그램은 사용자의 파일이 실제로 저장되지 않았을 때 저장되었다고 가정 할 수 있습니다. 사용자 "파일을 저장할 수 없습니다."

예외에 대한 메시지는 다른 개발자를위한 것입니다. 개발 중에 프로그램이 중단되면 개발자는 스택 추적을보고 더 이상 쉽게 예상치 못한 일이 발생한 이유를 쉽게 파악할 수 있어야합니다. 이상적으로 개발자는 오류를 제작 중에도 볼 수있는 방법으로 오류를 기록 할 수 있습니다.

+0

저는 개인적으로'On Error Resume Next'를 선호합니다 ... 나는 떨림없이 말할 수조차 없습니다. 버그를 일으킨 사람의 실제 세계 수와 같았던 버그에 대한 증상이있었습니다. – ChaosPandion

+0

@ChaosPandion : 나의 동정심. 페일 패스트는 친구입니다. – StriplingWarrior

2

예외는 일반적으로 메서드 계약이 위반되었음을 나타냅니다. 이 메서드의 클라이언트는 예외를 염려하고 적절하게 처리해야합니다. 계약을 위반할 때, 방법 자체는 일반적으로 회복 될 수 없으며 의미있는 결과를 가져올 수 없습니다. 예외는 의미있는 결과가 곧 나타나지 않음을 나타냅니다.

+0

+1 : 이것은 내가 들었던 예외 처리에 대한 가장 합리적인 규칙 일 것입니다. 그러나 로그인 컨텍스트의 일반 오류 코드와 관련된 보안 문제가 있습니다. –

0

우아한 방법 :

이 문서에서는 많은 좋은 지침이 포함되어 있습니다.

0

So.당신은 훌륭한 프로그램을 작성했습니다. 이 프로그램은 가능한 실패 지점이 있습니다. 어떤 이유로 든 프로그램의 일부가 실패한 경우 나머지 프로그램을 계속 진행하고 실패에 대해 명시 적으로주의를 기울이거나 기록하거나 계속 진행하기를 원할 수 있습니다.

나는 의사 코드 구문을 사용하는거야,하지만 당신은 그것을 수행 할 수 있어야한다 :

var pw=$_POST['pw']; 
    var un=$_POST['un']; 
    try{ 
     $sql="select lastlogin,access from users where un=q(/'$un'/) and pw= q(/'md5($pw)'/)"; 
     $user=$db->getRow($sql); 
     if(!$user) { 
      //they don't exist 
     }else{ 
     //process their login 
     } 
    }catch(Exception $e){ 
      //we has a Database error. either my query s really screwed up or the DB is down. let's log it and exit this stream; service 
      $mylogger->log("Error while logging in using module $MODULENAME$ ".implode("<br/>",(array)$e)); 

     exit; 
    } 
+0

PHP 의사 코드는 언제부터입니까? –

+0

그래, 디버깅을하지 않고 ... 내 q (/ ''/) 구문에 대해 잘 모르겠습니다. 지금 신탁에서 그렇게 할 수 있다고 생각하지만 잊어 버린 것 같습니다. – FatherStorm

-3

예외의 성격이 명시 적으로 무시해야한다는 것입니다. 이 기능이 있다고 가정 :

bool authenticate (String username, String password) 
{ 
    if (invalid_password(password)) { 
     return (false); 
    } 
    // ... perform authentication ... 
} 

이제이 일부 서버의 일부임을 고려하고, 서버는 권한이 높은 상황에서 실행. 호출 코드 (권한 부여를 수행하는 코드)가 논리에 오류가 있으면 의도하지 않게 사용자가 일반적으로 허용되지 않는 작업을 수행 할 수 있습니다. 이 순전히 방어 프로그래밍 방식이다

void authenticate (String username, String password) 
{ 
    if (invalid_password(password)) { 
     throw new LoginFailed(); 
    } 
    // ... perform authentication ... 
} 

참고하고,이 컨텍스트 내에서 내 취향이다

내가 대신 다음 함수를 작성합니다. 이렇게하면 로그인 오류로 인해 작업이 계속 실행되지 않을 가능성이 높습니다.

+0

... 이것에 대해 더 생각해야했고,이 냄새가 난다. 그것이 영리한 동안, 그것은이 코드를 소비자에게 더 어렵게 만듭니다. 다른 개발자는이 메서드가 false를 반환하는 대신 예외를 throw하는 것을 어떻게 알 수 있습니까 (서명이 암시 하듯이)? – STW

+0

이 문맥에서'void authenticate()'로 정의 된 메소드를 가지는 것이 더 낫습니다. - 항상'true'를 반환하거나 예외를 throw하는 코드 - 냄새의 함수. – STW

+0

@STW : 다른 개발자는 어떻게 알 수 있습니까? 물론 API에 대한 설명서를 읽으십시오. 이것은 분명히 예외 VS 오류 코드에 중점을 두어 코드가 수행하는 것만 보여줍니다. –

0

로그인 할 수없는 경우 함수가 예외를 throw하면 함수를 호출하는 코드는 함수가 반환하면 로그인한다고 가정 할 수 있습니다. 그러면 코드의 작업량이 줄어 듭니다. "로그인 실패"시나리오에서 더 많은 작업을 요구하는 대가로 "로그인 성공"시나리오를 처리하십시오. 코드가 때때로 반 예상되는 경우 (예 : 한 세트의 자격 증명으로 로그인 시도, 작동하지 않는 경우 다른 세트 시도), 예기치 않게 실패 할 때 복구 할 수없는 경우에 코드가 사용되는 경우가 있습니다. 부울 플래그를 던지거나 별도의 "Login"및 "TryLogin"메소드를 사용하는 데 도움이됩니다.

관련 문제