<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # SQLite Perl 錯誤處理 > 原文: [http://zetcode.com/db/sqliteperltutorial/err/](http://zetcode.com/db/sqliteperltutorial/err/) 在本章中,我們將展示如何處理錯誤。 | 方法名稱 | 描述 | | --- | --- | | `$h->err()` | 從上次調用的驅動程序方法返回本機數據庫引擎錯誤代碼。 | | `$h->errstr()` | 從最后一個調用的 DBI 方法返回本機數據庫引擎錯誤消息。 | | `$h->state()` | 返回標準`SQLSTATE`五字符格式的狀態碼 | 以上三種方法處理錯誤消息。 | DBI 動態屬性 | 描述 | | --- | --- | | `$DBI::err` | 相當于`$ h->err()` | | `$DBI::errstr` | 相當于`$h->errstr()` | | `$DBI::state` | 相當于`$h->state()` | 第二張表列出了與錯誤處理有關的 DBI 動態屬性。 這些屬性的壽命很短。 應該在可能導致錯誤的方法之后立即使用它們。 ## 默認錯誤處理 默認情況下,錯誤由 Perl DBI 方法返回。 ```perl #!/usr/bin/perl use strict; use DBI; my $dsn = "dbi:SQLite:dbname=test.db"; my $user = ''; my $password = ''; my $dbh = DBI->connect($dsn, $user, $password) or die "Can't connect to database: $DBI::errstr"; my $sth = $dbh->prepare( q{ SELECT Id, Name, Price FROM Cars } ) or die "Can't prepare statement: $DBI::errstr"; my $rc = $sth->execute() or die "Can't execute statement: $DBI::errstr"; while (my($id, $name, $price) = $sth->fetchrow()) { print "$id $name $price\n"; } # check for problems which may have terminated the fetch early warn $DBI::errstr if $DBI::err; $sth->finish(); $dbh->disconnect(); ``` 在第一個腳本中,我們處理返回錯誤代碼的默認行為。 ```perl my $dbh = DBI->connect($dsn, $user, $password) or die "Can't connect to database: $DBI::errstr"; ``` 我們調用`connect()`方法來創建數據庫連接。 如果嘗試失敗,則該方法返回`undef`并設置`$DBI::err`和`$DBI::errstr`屬性。 `die()`方法在失敗的情況下會打印錯誤消息并終止腳本。 ```perl my $sth = $dbh->prepare( q{ SELECT Id, Name, Price FROM Cars } ) or die "Can't prepare statement: $DBI::errstr"; ``` 我們稱為`prepare()`語句。 如果該方法失敗,則`die()`方法將顯示錯誤消息并終止腳本。 ```perl my $rc = $sth->execute() or die "Can't execute statement: $DBI::errstr"; ``` 再次。 我們調用`execute()`方法并檢查錯誤。 如果失敗,該方法將返回`undef`。 ```perl warn $DBI::errstr if $DBI::err; ``` 我們檢查可能會提早終止提取方法的問題。 ## 引發異常 每次我們調用 DBI 方法時都要檢查錯誤,這可能很麻煩。 如果我們的腳本較大,我們很容易忘記這樣做。 處理可能的錯誤的首選方法是引發異常。 為了引發異常,我們將`RaiseError`屬性設置為`true`。 ```perl #!/usr/bin/perl use strict; use DBI; my $dsn = "dbi:SQLite:dbname=test.db"; my $user = ''; my $password = ''; my %attr = ( RaiseError => 1 ); my $dbh = DBI->connect($dsn, $user, $password, \%attr) or die "Can't connect to database: $DBI::errstr"; my $sth = $dbh->prepare("SELECT * FROM Cars LIMIT 5"); $sth->execute(); while (my($id, $name, $price) = $sth->fetchrow()) { print "$id $name $price\n"; } $sth->finish(); $dbh->disconnect(); ``` 在連接屬性中,我們將`RaiseError`屬性設置為 1。發生錯誤時,引發異常,而不是返回錯誤代碼。 ```perl my %attr = ( RaiseError => 1 ); ``` 我們將`RaiseError`屬性設置為 1。 ```perl my $dbh = DBI->connect($dsn, $user, $password, \%attr) or die "Can't connect to database: $DBI::errstr"; ``` `connect()`方法是我們檢查返回代碼的唯一方法。 ```perl my $sth = $dbh->prepare("SELECT * FROM Cars LIMIT 5"); $sth->execute(); ``` `prepare()`和`execute()`方法不檢查返回錯誤代碼。 如果失敗,將引發異常,Perl DBI 將調用`die()`方法并打印錯誤消息。 ## 錯誤子程序 使用`HandleError`連接句柄屬性,我們可以設置對子例程的引用,該子例程在檢測到錯誤時被調用。 用三個參數調用該子例程:`RaiseError`和`"PrintError"`將使用的錯誤消息字符串,正在使用的 DBI 句柄以及失敗的方法返回的第一個值(通常為`undef`)。 如果子例程返回錯誤值,則將檢查`RaiseError`或`PrintError`屬性,并按常規操作。 ```perl #!/usr/bin/perl use strict; use DBI; my $dsn = "dbi:SQLite:dbname=test.db"; my $user = ''; my $password = ''; my %attr = ( RaiseError => 1, AutoCommit => 0, HandleError => \&handle_error ); my $dbh = DBI->connect($dsn, $user, $password, \%attr) or die "Can't connect to database: $DBI::errstr"; $dbh->do("UPDATE Cars SET Price=52000 WHERE Id=1"); $dbh->do("UPDATE Car SET Price=22000 WHERE Id=8"); $dbh->commit(); $dbh->disconnect(); sub handle_error { $dbh->rollback(); my $error = shift; print "An error occurred in the script\n"; print "Message: $error\n"; return 1; } ``` 我們自己的子例程將處理該錯誤。 ```perl my %attr = ( RaiseError => 1, AutoCommit => 0, HandleError => \&handle_error ); ``` 當檢測到錯誤時,`HandleError`屬性提供對所調用的`handle_error()`子例程的引用。 `AutoCommit`已關閉,這意味著我們正在處理事務。 ```perl $dbh->do("UPDATE Car SET Price=22000 WHERE Id=8"); ``` SQL 語句中有錯誤。 沒有`Car`表。 ```perl sub handle_error { $dbh->rollback(); my $error = shift; print "An error occurred in the script\n"; print "Message: $error\n"; return 1; } ``` 這是`handle_error()`子例程。 我們回滾這些更改。 我們打印錯誤消息并返回 1。如果返回 0,則會出現其他錯誤消息。 禁止返回與`RaiseError`屬性相關的 1 條錯誤消息。 ```perl $ ./errsub.pl An error occurred in the script Message: DBD::SQLite::db do failed: no such table: Car ``` 示例的輸出。 ## `eval`的例子 根據 Perl DBI 文檔,處理 DBI 錯誤的最可靠的方法是使用`eval()`方法。 ```perl #!/usr/bin/perl use strict; use DBI; use DBI qw(:sql_types); my $dsn = "dbi:SQLite:dbname=test.db"; my $user = ''; my $password = ''; my %attr = ( RaiseError => 1, AutoCommit => 0 ); my $dbh = DBI->connect($dsn, $user, $password, \%attr) or die "Can't connect to database: $DBI::errstr"; my @data = ( [ 1, "Audi", 52642], [ 2, "Mercedes", 57127], [ 3, "Skoda", 9000], [ 4, "Volvo", 29000], [ 5, "Bentley", 350000], [ 6, "Citroen", 21000], [ 7, "Hummer", 41400], [ 8, "Volkswagen", 21601] ); eval { $dbh->do("DROP TABLE IF EXISTS Cars"); $dbh->do("CREATE TABLE Cars(Id INTEGER PRIMARY KEY, Name TEXT, Price INT)"); }; my $sql = qq{ INSERT INTO Cars VALUES ( ?, ?, ? ) }; my $sth = $dbh->prepare( $sql ); foreach my $row (@data) { eval { $sth->bind_param( 1, @$row[0], SQL_INTEGER ); $sth->bind_param( 2, @$row[1], SQL_VARCHAR ); $sth->bind_param( 3, @$row[2], SQL_INTEGER ); $sth->execute(); $dbh->commit(); }; if( $@ ) { warn "Database error: $DBI::errstr\n"; $dbh->rollback(); } } $sth->finish(); $dbh->disconnect(); ``` 上面的代碼示例是處理錯誤的最正確方法。 ```perl my %attr = ( RaiseError => 1, AutoCommit => 0 ); ``` 我們提出異常,而不是檢查返回碼。 我們關閉自動提交模式,然后手動提交或回滾更改。 ```perl my $sql = qq{ INSERT INTO Cars VALUES ( ?, ?, ? ) }; my $sth = $dbh->prepare( $sql ); ``` 我們使用占位符來防止錯誤和安全問題。 ```perl eval { $sth->bind_param( 1, @$row[0], SQL_INTEGER ); $sth->bind_param( 2, @$row[1], SQL_VARCHAR ); $sth->bind_param( 3, @$row[2], SQL_INTEGER ); $sth->execute(); $dbh->commit(); }; ``` 在`eval()`方法內部,我們放置了容易出錯的代碼。 該方法捕獲異常,并用錯誤消息填充`$@`特殊變量。 我們使用`bind_param()`方法將變量綁定到占位符。 ```perl if( $@ ) { warn "Database error: $DBI::errstr\n"; $dbh->rollback(); } ``` 如果發生錯誤,我們將打印錯誤消息并回滾更改。 在 SQLite Perl 教程的這一部分中,我們正在討論錯誤處理。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看