2012-01-11 2 views
3

나는 이것에 대해 나와 의견이 다른 친구가 있으며, 나는이 상황에서 누가 옳고 그른지에 관해서 약간의 피드백을 얻으 려하고있다. 네트워크/파일 시스템 호출로 작업 할 때 예외 (예방 유지 보수)에 대한 방어?

FileInfo file = ...; 

if (file.Exists) 
{ 
    //File somehow gets deleted 

    //Attempt to do stuff with file... 
} 

내 친구가 지적한 문제

그래서 제가 존재를 확인 할 때 파일이 존재하는지? 삭제됩니다 바로 후에하면 파일을 확인 가능성을 방지하기 위해 아무것도 시도가 액세스 할 수 없다 "이다 예외가 발생하기 때문에 사전에 존재 여부를 확인하는 것이 가치가 있습니까? "

내가 생각해 낼 수있는 유일한 점은 MSDN이 분명히 예제를 확인한다는 것입니다. 따라서 더 많은 내용이 있어야합니다. MSDN - FileInfo. 하지만, 그게 나 한테 궁금해할만한 가치가 있단 말이야?

+1

나는 친구와 거의 일치합니다. 코드를 강건하게 만들기 위해서는 예외를 트래핑해야하는데, 이는'file.Exists' 비트가 중복되게 만듭니다. 반면에 많은 파일을 처리하는 경우, 그 중 많은 부분이 빠져있을 수 있으므로 예외 처리 메커니즘을 트리거하는 오버 헤드를 피하기 위해'file.Exists' 비트를 사용합니다. –

+0

throw되는 예외가없는 예외 블록을 포함하는 것은 성능상의 비용이 들지 않는다는 것을 기억하십시오. 특히 파일의 경우 예외 처리를 사용하지 않는 것에 비해 어렵습니다. 그렇지 않으면 수표와 통화 사이에 수 밀리 초가됩니다. –

답변

3

나는 모두 if (file.Exists)try catch입니다. 예외 처리에만 의존한다고해서 당신이 염두에두고있는 것을 명시 적으로 표현하지는 않습니다. if (file.Exists)은 자체 설명입니다.

누군가 파일 검사와 작업 사이에 밀리 초 만에 파일을 삭제하더라도 여전히 예외가 발생할 수 있습니다. 그럼에도 예외가 발생할 수있는 다른 조건이 있습니다. 파일이 읽기 전용이므로, 요청한 보안 권한 등이 없습니다.

0

문맥에 따라 다릅니다. 파일이 방금 작성된 후이 프로세스가 실행 된 경우, 존재하는지 점검하는 것은 의미가 없습니다. 코드가 아직 실행 중이기 때문에 코드가 있다고 가정 할 수 있습니다.

그러나이 파일이 계속 삭제 된 파일 인 경우 &이 작성되면 계속 진행하기 전에 존재하는지 확인하는 것이 좋습니다.

다른 요소는 파일에 액세스하는 사람/사람입니다. 파일에 액세스하는 클라이언트가 여러 개인 경우 파일이 수정/제거 될 확률이 높으므로 파일이 있는지 확인하는 것이 좋습니다.

3

대부분의 경우 귀하의 친구와 동의합니다 (귀하의 질문에서 관련 정보를 보류했는지 여부에 달려 있습니다). 이것은 훌륭한 코드 외부에서 발생할 수있는 예외의 예입니다. 파일의 존재를 확인하고 작업을 수행하는 것은 경쟁 조건입니다.

사실이 예외가 발생할 수 있으며이를 방지하기 위해 할 수있는 일이 없습니다. 너는 그것을 잡아야한다. 그것은 당신의 통제에서 완전히 벗어났습니다. 예를 들어, 네트워크가 다운되거나 번개가 데이터 센터에 닿았을 때 불이 붙거나 다람쥐가 케이블을 통해 씹는다면 어떻게 될까요? 코드가 예외를 발생시키는 모든 방법을 찾아내는 것은 실용적이지 않지만, 좋은 가능성을 알고 그것을 처리하기 위해 최선을 다하는 상황에서 최선을 다하는 것이 좋습니다.