2013-04-30 2 views
4


저는 Perl 프로그래밍을 처음 접했을뿐 아니라 제 질문이 잘못된 방식으로 공식화 될 수도 있지만 실제로 많은 것을 읽었습니다. 도서 및 자습서와 내 문제를 언급 (심지어 언급) 아무것도 찾지 못했습니다.Perl SQLite 오류 처리 : 오류 코드에 따라 다른 작업 수행

DBI 및 SQLite를 사용하여 복구 할 수있는 오류 (DB가 꽉 찼거나 잠긴 경우 등)가 발생하면 삽입 쿼리를 다시 시도하는 코드를 작성하려고하지만 오류를 복구 할 수없는 경우 죽습니다 (DB가 삭제되거나 손상되거나, 기타.).

나는 SQLite는 C 인터페이스는 오류 코드를 수출 것으로 나타났습니다 :

http://www.sqlite.org/c3ref/c_abort.html

하지만 난 펄 비슷한 아무것도 발견하지 않았습니다. 첫 번째 Perl 프로그램에서 매직 넘버를 사용할 필요가 없다면 정말 좋겠다. :-)

그런데, 내가 본 온라인 문서와 예제는 DBI에서 자동 (즉 예외가있는) 오류 처리를 아주 잘 설명하지만 오류에 따라 다른 작업을 수행하는 방법을 보여주지는 못합니다 유형. 일반적인 사용 사례가 아닌가?
또한 DBI :: err은 어떤 오류가 발생했는지 알 수있는 올바른 변수가 아닙니다. 그들은 DBI :: errstr이 사용되어야한다고 암묵적으로 말합니다.하지만 인간 지향적 인, 아마도 여러 줄의 에러 문자열에 대한 문자열 비교에 의존하는 것은 다소 어색합니다.

감사합니다. 암시!

+0

대부분의 응용 프로그램에서 모든 데이터베이스 오류는 치명적인 것으로 간주됩니다. – jordanm

+0

[DBI] (http://search.cpan.org/~timb/DBI-1.625/DBI.pm#errstr)는 반대입니다 : "errstr() 메서드를 사용하여 오류를 테스트해서는 안되며 err () 왜냐하면 드라이버는 '실패'가 아닌 메소드에 대해 errstr()을 통해 '정보가있는 성공'또는 경고 메시지를 반환 할 수 있기 때문입니다. " – charlesbridge

+0

@charlesbridge 오류가 있는지를 검사하기 위해 err()을 사용하지만 어떤 종류의 오류가 발생했는지는 알려주지 않습니다. 일부 드라이버의 경우 오류는 -1이됩니다. 이 사실을 DBD :: SQLite, 따라서 내 질문에 대한 것 : err() 비교하는 기호 상수가 있습니까? – David

답변

1

DBI를 사용한 저의 작업은 거의 항상 sqlite3 대신 mysql을 사용했기 때문에 직접적인 경험으로 말할 수는 없습니다. 그러나 절대적으로 마법의 줄과 숫자를 확인해야한다면 너무 나쁘지는 않습니다. 중요한 것은 당신이 어떻게하는지입니다. 매직 문자열 및/또는 숫자에 의존해야 할 때마다 스크립트의 구성 부분 (또는 심지어 구성 파일까지)에 상수 또는 해시로 입력해야합니다.

마법의 숫자/문자열에 대한 나쁜 점은 변경하면 관리하기가 어렵거나 아무도 그 조건을 생성하는 것을 기억하지 않는다는 것입니다. 그러나 올바르게 작성하고 문서화하면 완화됩니다.

BTW - 방금 시작한 사람이라면 Damian Conway의 "Perl Best Practices"를 읽어 보시기 바랍니다. 나는 체크했고, 그는 마술 문자열/숫자를 다룰 수는 없지만 여전히 Perl에서 읽은 책 중 최고의 책이다. 일단 PBP를 살펴 본다면 펄 크리틱 (Perl Critic)을 보아라. 그것은 당신을 울게 할 훌륭한 도구이다. 그것은 마술 문자열, 그리고 많은, 많은 다른 것들을 표시합니다 :)

+0

문서 포인터를 보내 주셔서 감사합니다! – David