2012-05-01 6 views
2

레일의 일부 메소드가 ! 연산자를 사용하여 유효하지 않은 예외를 발생시키는 것으로 나타났습니다. 예 : User.create!언제 메소드에서 예외를 발생시킬 것인가?

왜 이런 식으로 사용하고 싶습니까?

감사합니다.

+0

Pedantic nit : '!'는 연산자가 아니며 메서드 이름의 일부입니다. 문제의 API에 따라 때로는 내부 데이터에서 _ 연산을 의미합니다. – sarnold

+0

그것은 정말로 현악기가 아닙니다. '! '는 연산자입니다 만, 메소드 명이'create!'와 같은 경우 연산자는 * 연산자가 아닙니다. –

답변

4

ActiveRecord will roll back a transaction if an exception is thrown while a transaction is active.

따라서 예외를 throw하는 메서드는 예외적 인 조건이 발생할 때 데이터베이스가 트랜잭션을 커밋하지 않도록 보장합니다. 직접 문제를 "처리"할 수 있거나 실제로 문제가 아닌 경우 !이없는 변형을 사용할 수 있으며 오류 조건의 반환 값을 확인하고 직접 처리 할 수 ​​있습니다.

  • 당신은 이미있는 경우, 다른 이름을 선택하기 위해 사용자가 제공 한 사용자 이름은 아직 포착되지 않은 경우 확인하고 사용자에 대한 프롬프트를 제공하기 위해 User.create 방법을 사용할 수 있습니다 : User.create 같은 특정 뭔가

    사용.

  • 마침내 요청을 제출할 때 User.create! 메서드를 사용하면 사용자가 친숙한 이름 확인을 무시하려고 시도 할 때 무결성 검사가 트랜잭션 생성 및 롤백에 실패 할 수 있습니다.
+0

매우 유용한 정보, 감사합니다 – Flexoid

+0

@ Fluxoid : Holger의 대답은 멋진 추가 점이 있습니다 – sarnold

+0

그런데 저자는 심볼을'operator * '라고 부릅니다. 이 심볼은 메소드 이름의 일부일 뿐이므로'create!'와'create'와 같은 두 가지 메소드가 있습니다.Ruby 기능입니다. 다른 많은 언어에서는 이러한 기호를 허용하지 않으므로 조작자와 쉽게 혼동 할 수 있습니다. – jdoe

6

나는 방법이 있지만 여기에 처리 실제 오류를 싶지 않아 성공 있는지 확인 할 수 있습니다 여러 가지 이유로

  • 에 대한 예외를 할 수 있습니다. 하지만 무엇인가 실패 할 경우 요청이 끊어 지더라도 (예 : HTTP 500을 생성)
  • 호출 체인에서 어떤 방식 으로든 오류를 처리하고 싶을 수 있습니다. 일반적으로, 오류 처리를위한 긴 방법으로 오류 상태를 가져 오는 것이 더 길고 불쾌합니다. 구조화 된 오류 처리, 즉 begin ... rescue ... end이 더 명확합니다.
  • 예외 (예 : 오류 메시지)
  • 첨부 된 추가 데이터를 가질 수 서로 다른 오류 유형이있는 경우
  • (C에서 공통으로), 그것은 종종 훨씬 명확 대신 마법 ID 값의 다른 예외 클래스를 가진 사람들을 대표하는

오류 상태가 수가 적고 통화 직후에 완전히 처리되는 경우 예외를 사용하지 않는 좋은 이유가 있지만 상태 플래그가 있습니다. 그러나 모든 기술에는 그 위치와 시간이 있습니다.

그리고 btw, save 메서드는 내부적으로 save!을 호출하고 잠재적 예외를 처리하고 있으면 예외를 반환합니다. 구현 방법은 the code을 참조하십시오.

관련 문제