2012-05-25 5 views
2

웹 응용 프로그램이 있습니다. ExtJs frontend - EntityFramework + SQL Server를 백엔드로 사용합니다. ?엔티티 프레임 워크. SQL을보고하는 방법 정상적으로 오류를 수정하는 방법

  • 나는 데이터베이스가이 (이름은 고유해야합니다) 내가 그에 대한 모든 클라이언트 측 유효성 검사 (해야 나는 방법이없는
  • 사용자 이름 제약 :의 오류 시나리오 중 하나를 살펴 보자 그러한 유효성 검사를 일반화하려면?)
  • 동일한 이름의 사용자를 삽입하려고하면 서버에서 500 오류를 반환합니다.
  • 동일한 컴퓨터에서 IIS를 실행하는 경우 - 다른 컴퓨터에서 실행하면 전체 오류 메시지 (기본적으로 SQL 예외 설명과 같은 키 위반 등)가 발생합니다. 단지 500 개의 오류 및 오류 메시지가 표시되지 않습니다.

이 문제를 해결하는 가장 좋은 방법은 무엇입니까? 나는 오류에 대해 사람이 읽을 수있는 형식으로 사용자에게 알릴 필요가있다. 좋은 연습이 아니기 때문에 IIS에서 오류 메시징을 사용하지 않으려합니다.

답변

2

여기에는 오류가 없지만 비즈니스 규칙 위반이 있다고 생각합니다.

두 가지를 구별하고 싶습니다. 처음에는 예기치 않은 상황 (예 : 데이터베이스 연결 손실과 같은 상황)과 나중에 발생할 가능성이있는 일부 시나리오가 있습니다.

오류의 경우 사용자가 수정할 수 없거나 자세한 정보가 필요하기 때문에 일반적인 방식으로 사용자에게 알리는 것이 좋습니다 (예 : '예기치 않은 오류가 발생했습니다').

반면에 비즈니스 규칙은 사용자가 이해할 수 있으며 수정하기 위해 조치를 취할 수있는 항목입니다 (여기서는 사용자 이름 제약 조건). 따라서 사용자에게이를 알려야합니다.

내가 작업 한 프로젝트에서 예외 유형이 BusinessException입니다. 우리는 문제가 무엇인지를 나타내는 메시지를 던져 사람이 읽을 수있는 형식으로 렌더링합니다.우리는이 예외를 try-catch하지는 않지만 핸들러를 사용하여 예외를 관리합니다. MVC를 사용하고 있다면, 할 수있는 확장 훅이 있습니다.

다른 유형의 예외의 경우 스택 추적을 어딘가에 (즉 EventViewer) 기록하는 것이 좋지만 사용자에게 세부 정보를 제공하지 않는 것이 좋습니다. 이 경우

, 나는 다음을 수행합니다 :

  • 는 사용자가 이름을 사전에 검증 할 수 있도록 버튼 이름 확인 되세요.
  • 이름의 유효성을 검사 할 위치는 응용 프로그램의 비즈니스 논리를 갖고 싶은 위치에 따라 다릅니다. DB에서는 저장 프로 시저를 사용하는 접근 방식이지만 EF를 사용하는 경우 이는 데이터 액세스에서 추상화하려는 것입니다. 대신 LINQ (Context.Users.SingleOrDefault(x => x.Name == name)과 같은 것을 사용하여이 유효성 검사를 직접 작성하고 null 또는 일부 사용자를 반환하는지 확인할 수 있습니다. 이미 DB 제약 조건이 적용되어 있으므로이 유효성 검사가 필요하지 않다고 생각할 수 있습니다.
  • 제약 조건 위반인지 또는 다른 오류인지를 결정하기 위해 SQL 오류 코드를 검사해야하기 때문에 EF에서 예외를 캡처하는 것이 번거로울 수 있습니다. 또한이를 결정할지라도 변환해야합니다. 사용자 친화적 하나에 메시지. 나는 이것이 당신의 결정에 당신이 도움이되기를 바랍니다

!

+0

그런 정답을 찾아 주셔서 감사합니다. 내가 말했듯이 LINQ 유효성 검사를 살펴볼 것입니다. 나는 귀하의 'Business-vs-Internal'오류 지점에 완전히 동의합니다. – sha

1

먼저 사용자에게 즉각적인 피드백을 제공함으로써 클라이언트의 서버에 제출하기 전에 유효성을 확인하는 것이 좋습니다. 검사 및 삽입을 수행하고 성공적으로 삽입에 대한 확인으로 새 레코드를 반환

  1. 를 사용하여 저장 프로 시저 :

    둘째, 내가 사용하는 커플이 당신이 실제 삽입을 위해 고려할 수있는 몇 가지 옵션이 있습니다 , 트랜잭션으로 처리하기 쉽고 스토어 프로 시저 내부의 모든 문제를 처리 할 수 ​​있지만 컴파일 된 코드 외부에 기능이 있습니다.

  2. 삽입 프로 시저에서 먼저 트랜잭션에서 유효성 검사를 호출하고 적절히 처리하십시오. 컴파일 된 코드를 사용하고 저장 프로 시저와 같은 외부 종속성의 복잡성을 줄이면서 몇 가지 제한 사항이 있습니다. 그 레이어 만 행할 수
  3. 시도에서 트랜잭션 잠금 유형의 삽입 및 예외를 catch하고 적절하게 처리하기 위해,이

난 당신의 업데이트를 언급 보지 못했다 내 가장 좋아하는 UserName이 기능을 허용하는 경우 삽입을 수행 할 때 나타나는 동일한 문제로 인해 업데이트 전에 유효성을 검사해야합니다.

+0

나는 클라이언트 측 유효성 검사에 동의한다. 나는 수 많은 스토어드 프로 시저를 갖고 싶지 않고 EntityFramework 내에서 받아 들일 수있는 오류를 반환하는 일반적인 방법을 찾고있었습니다. 이런 건 아시나요? 나는 CommitChanges 함수에 대한 이벤트 (이 작업을 수행하는 데 사용하는)가 없다는 것을 의미합니다. EF는 모든 것을 InsertXXXX/UpdateXXX에 자동으로 전송합니다. – sha

1

클라이언트 쪽 유효성 검사가 필요하지 않습니다. 그러한 유효성 검사를 일반화하는 방법은 이 있습니까?)

나는 항상 그렇게 할 것입니다. jquery ajax를 사용하여 서버 페이지를 호출하고 거기에서 데이터를 확인할 수 있습니다. 이를 통해 사용자는 제출 단추를 클릭하기 전에 사용자 이름을 사용할 수 없다는 것을 알 수 있습니다. 그러면 사용자 환경이 개선됩니다. 이 방법은 다른 서버 왕복을 피할 수 있습니다 (모든 양식 데이터를 포함한 일반 양식 게시 및 오류 수신).

동일한 이름의 사용자를 삽입하려고하면 서버에서 500 오류를 반환합니다.

코드에서 예외를 항상 catch하고 을 기록하십시오. 오류에 대해 사용자에게 친숙한 메시지를 보여줍니다. 최종 사용자에게 Exception의 Stacktrace를 표시하지 마십시오. ASP.NET을 사용하는 경우 사용자 지정 오류 페이지 기능을 사용하십시오.

관련 문제