문제

난 항상 느낌을 기대하는 예외가 발생에 정기적으로 그들을 사용하여 흐름의 논리가 나쁜 것은 아니다.예외 같은 느낌 그들은 해야,잘,"예외".당신이 예상하고 계획을 위한 예외는 것을 나타내는 것은 코드 리팩터링해야 한다 적어도니다.순...
그러나입니다.최근 시나리오는 나에게 일시 중지합니다.게시 이에 msdn 동안 전지만,나는 생성에 대해 자세히 논의하고,이것은 완벽한 장소입니다!

그래서 말,당신은 데이터베이스 테이블이있는 외국의 열쇠를 위한 여러 가지 기타 테이블(경우에는 원래라는 메시지가 논의가 있었 4 외국의 열쇠를 가리키).허용할 사용자를 삭제하지만,없는 경우에만 외국인 핵심이 참조당신이 원하지 않는 모두 삭제합니다.
나는 일반적으로 다만 확인이 있는 경우 참고가 있는 경우에,나는 사용자에게 알리신을 삭제합니다.그것은 매우 쉽고 편안하게 작성하는 LINQ 에서 관련 테이블은 회원에체,그래서 섹션입니다.프로젝트 섹션입니다.카테고리 및 등등하기 좋은 형식으로 intellisense 다.
하지만 사실은 LINQ 다음을 치고 있는 잠재적으로 모든 4 개의 테이블가 있는지 확인하기 위해 어떤 결과를 가리키는 행를 기록하고,데이터베이스는 물론 항상 상대적으로 작업입니다.

도 이 프로젝트에 요청을 변경하는 날이 그것을 잡아 SqlException 코드의 547(외국 key)고 그것을 다루는 방법입니다.

나는...
.

그러나 이 경우에,그것은 아마 많이 더 효율적으로 삼는 예외 관련 오버헤드가 삼키는 4 표다.특히 때문에 우리가 할 일은 체크인 모든 경우에,그러나 우리는 절약을 제외한 경우에 없을 때 아이들이...
데이터베이스는 정말 하나가 될 책임이 처리하기 위한 참조 무결성,그의 작업 그리고 그것은 잘...
그래서 그들은 나는 변경되었습니다.

어떤 수준에서 그것은 여전히 느낌 잘못된 나에게 하지만입니다.

당신은 무엇을 생각하는 사람에 대해 기대하고 의도적으로 예외 처리?그것은 좋을 때는 것을 보는 것보다 더 효율적으로 할 수에서 사?그것은 복잡하여 다음 개발자의 코드,또는 더 적은 혼란?그것이 더 안전하기 때문에,데이터베이스에 대해 알고 있습니다 새로운 foreign key 는 개발자도 생각하지 않을 추가하려면 체크인가?또는 그것의 문제는 관점에서 정확히 무엇을 생각하는 제일 연습니까?

도움이 되었습니까?

해결책

Wow,

첫째,당신은 증류는 질문에 조금 아래하는 동안,그것은 좋은 읽기만 생각하고 설명했다 질문에는 아주 많이 소화했다.

짧은 대답은"예"그러나 그것을 할 수 있습니다.

  • 우리는 일부 응용 프로그램은 우리가 많은 비즈니스의 논리에 묶여 SQL 쿼리(지 디자인 Gov!).면 이것은 어떻게 구성,관리할 수 있습을 설득하기가 어렵지 않았기 때문"이미 작동합니다."
  • 이 상황에서,그것은 정말 큰가?이후 그것은 여전히 하나의 여행에 걸쳐 철사 그리고 다시.서버 많은 일을 하기 전에 그것을 깨닫는 계속할 수 없습니다(i.e.이 있는 경우는 트랜잭션 시퀀스는 귀하의 작업,그 다음 가을 절반 이상이 방법을 통해 시간을 낭비하?).
  • 그것이 의미하는지 확인 UI 에서 첫 번째?그것이 도움이 되는 응용 프로그램과 함께?제공하는 경우에 더 좋은 사용자 경험이 있는가?(i.e본 경우는 단계를 통해 여러 단계에서는 마법사가 시작되면,그때 하나가 떨어지면 그것은 모든 정보하는 데 필요한 가을 통해 후 1 단계).
  • 는 동시성 문제가 있으십니까?그것은 가능한 레코드 제거 될 수 있도/편집하거나 어떤 전 commit 치(로에서 클래식 File.Exists 부-부).

에 내 의견:

모두.면 나는 실패할 수 있는 빠르고 더 나은 사용자 경험을 제공합니다.예상 SQL(또는 다른)예외를 받고 있어야 잡아서 다시 공급이 적절하게 어쨌든.

내가 알고 있는 합의하는 예외에는 사용하지 않아야한다 예외적인 상황, 하지만,기억,우리는 횡단 응용 프로그램의 경계를 여기서, 예 아무것도.내가 말했듯이,이 File.Exists, 가 없,삭제할 수 있습기 전에 당신은에 액세스한다.

다른 팁

귀하의 지도가 절대적으로 오른쪽.예외는 단지 한 번에 상황이지만,구체적으로 보고 이외의 다른 예상한 결과입니다.

이 경우에는 외국인 핵심인 것 여전히,그리고 예외는 메커니즘에 의해할 수 있는 통지합니다.

무엇을 해야하지 않은 잡아 억제하는 예외로 담요 포괄적 문의입니다.고 세분화된 예외 처리가 특별히 왜 예외도록 설계되었습니다.

나는 당신이 옳다고 생각합니다. 예외는 처리하는 데만 사용되어야합니다. 예기치 않은 결과, 여기에서 예상 결과를 다루기 위해 예외를 사용하고 있으며,이 사례를 명시 적으로 처리해야하지만 여전히 가능한 오류를 보여주기 위해 예외를 포착해야합니다.

이것이 코드 전체 에서이 사건이 처리되는 방식이 아니라면, 나는 당신과 함께 할 것입니다. 성능 문제는 실제로 문제인 경우에만 제기해야합니다. 즉, 해당 테이블의 크기 와이 기능이 사용되는 횟수에 따라 다릅니다.

좋은 질문. 그러나 나는 대답을 찾았다 ... 무서운!
예외는 일종의 goto입니다.
스파게티 코드로 이어지기 때문에 이런 식으로 예외를 사용하는 것을 좋아하지 않습니다.
그렇게 간단합니다.

당신이하는 일에는 아무런 문제가 없습니다. 예외는 "예외적"이 아닙니다. 그들은 호출 객체가 필요에 따라 미세한 오류 처리를하도록 허용하기 위해 존재합니다.

특정 sqlexception을 잡는 것이 옳은 일입니다. 이것은 SQL Server가 외국 키 조건을 전달하는 메커니즘입니다. 예외 메커니즘의 다른 사용을 선호하더라도 SQL Server가 수행하는 방식입니다.

또한 4 개의 테이블을 확인하는 동안 일부 사용자는 수표가 완료되기 전에 관련 레코드를 추가 할 수 있지만 해당 테이블을 읽은 후에는 관련 레코드를 추가 할 수 있습니다.

종속성이 있는지 확인하는 저장된 절차를 호출 한 다음 없으면 삭제하는 것이 좋습니다. 그렇게하면 무결성 검사가 수행됩니다.

물론, 당신은 아마도 싱글 톤 삭제 대 배치 삭제에 대한 다른 저장 절차를 원할 것입니다 ... 배치 삭제는 어린이 행을 찾고 벌크 삭제에 적합하지 않은 레코드 세트를 되돌릴 수 있습니다 (자식 행). .

나는 프로그램의 모든 곳에서 예외를보고 싶지 않지만이 경우 예외 메커니즘을 사용합니다.

LINQ에서 테스트하더라도 LINQ로 무결성을 테스트하는 동안 누군가가 어린이 기록을 삽입 할 경우 예외를 포착해야합니다. 어쨌든 예외를 확인해야하므로 코드를 복제하는 이유는 무엇입니까?

또 다른 요점은 이러한 종류의 "단거리"예외로 인해 유지 보수 문제가 발생하지 않으며 프로그램을 읽기가 더 어려워집니다. 당신은 시도, 삭제하려는 SQL 호출 및 캐치를 10 줄의 코드 내에있는 모든 것을 함께 시도 할 수 있습니다. 의도는 분명합니다.

5 개의 프로 시저 호출 호출은 스택에서 상단으로 호출되는 예외를 던지는 것과는 다릅니다.

예외는 항상 마법의 대답은 아니지만이 상황에서 사용하는 것이 잘못 느끼지 않을 것입니다.

내 두 센트,

이브

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top