2

これが私の可能な解決策です:

1)exit()スクリプトを終了するために使用します。(問題:データベースからのデータだけでなく、ページ全体のコンテンツの読み込みに影響します)

<div>2)考えられる例外を表示するために、ページに要素を特別に埋め込みます。

標準的なアプローチは何ですか?

4

6 に答える 6

3

データベースからの例外を処理する方法には、実際には「標準的な」アプローチはありません。それは完全に特定のユースケースに依存します。たとえば、最初のケースでデータベース接続を確立できない場合は、エラーページにリダイレクトして、すぐにサイト管理者に電子メール通知を送信するのが適切である可能性があります。一方、(何らかの理由で)1回の挿入を実行できない場合は、ユーザーが試みていたことが達成できなかったことをユーザーに通知し、再試行するように依頼する方が適切な場合があります。

例外は基本的に、使用しているプログラミング言語やライブラリではなく、問題が発生した場合の処理​​方法を決定するための方法ですほとんどの場合、エラーをログに記録する必要があります。その後、最も適切な応答を決定するのはあなた次第です。

つまり、例外を処理する適切な方法は、アプリケーションで最も意味のある方法です。

于 2012-10-31T14:42:37.730 に答える
1

オプション1)は、ユーザーエクスペリエンスが低下するため、乱雑です。

オプション2)が優先されます。

PDOを使用すると、次のコードで例外が表示され、タイムスタンプとともに保存されます。

try {  
    $dbh = new PDO("mysql:host=$host;dbname=$database", $username, $password);  
    $dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );  
    $stmt = $dbh->prepare("INSERT INTO table ( column ) values ( value )");  
    $stmt->execute(); 
    }  
catch(PDOException $e) {  
    echo "I'm sorry I'm afraid you can't do that.". $e->getMessage() ;// Remove or modify after testing 
    file_put_contents('PDOErrors.txt',date('[Y-m-d H:i:s]'). $e->getMessage()."\r\n", FILE_APPEND);  
}  

実稼働サイトでは、エコーステートメントをテストした後、次のように修正する必要があります。

echo "I'm sorry I'm afraid you can't do that.";
于 2012-10-31T21:59:43.970 に答える
1

例外をログファイルに記録し、それを使用して何が悪かったのかを分析する必要があります。ただし、ユーザーの観点からは、「リクエストを処理できませんでした」などのわかりやすいステートメントを表示する必要があります。

于 2012-10-31T14:43:15.737 に答える
1

私のプロジェクトでも同じ問題に直面しました。最初に、david strachanと同様の解決策を考えましたが、最終的に、この解決策が完全ではないことに気付きました。まだデバッグ情報が必要ですが、ユーザーに表示されるべきではありません。

「システムエラーです。もう一度やり直してください。エラーが続く場合は、サポートに連絡してください」というメッセージをユーザーに表示するソリューションを思いつきました。また、同時に、エラーメッセージはエラーログファイルに記録されます。

詳細は次のとおりです。

function logException ($exception) {

    // Construct the error message to add to the log file
    $logDate = date("l, F j, Y  H:i:s");            
    $logMessage = "Date: " . $logDate . "\n";
    $logMessage = $logMessage . "Error Message: ". $exception->getMessage() . "\n";
    $logMessage = $logMessage . "Error Code: ". $exception->getCode() . "\n";
    $logMessage = $logMessage . "Error File: ". $exception->getFile() . "\n";
    $logMessage = $logMessage . "Error Line: ". $exception->getLine() . "\n";
    $logMessage = $logMessage . "Error Trace:\n". $exception->getTraceAsString() . "\n";
    $logMessage = $logMessage . "\n\n**************************************" . "\n\n\n";

    // Construct a log file name similar to the name of the script file that cause the error
    $info = pathinfo($exception->getFile());
    $extension = "." . $info["extension"];
    $logFile =  "../logs/" .  basename($exception->getFile(), $extension) . ".log";

    // Add the error message to the log file            
    error_log($logMessage, 3, $logFile);

    // Message to return to the user
    $errorMessage = "System error, please try again, if the error persists, then please contact support.";

    return $errorMessage;
} 


try {  
    $dbh = new PDO("mysql:host=$host;dbname=$database", $username, $password);  
    $dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );  
    $stmt = $dbh->prepare("INSERT INTO table ( column ) values ( value )");  
    $stmt->execute(); 
}  

// Catching all sorts of errors, including PDO errors
catch (Exception $e) {
    $message = logException ($e);
    $data['message'] = $message;
    $data['isSuccessful'] = false;
}

次の点に注意してください:

  1. エラーメッセージはログファイルに保存されます
  2. ログファイルはログフォルダに保存されます。ログファイルの名前は、エラーを生成したファイルの名前に由来します。たとえば、エラーの原因となったファイルの名前が「script.php」の場合、ログファイルの名前は「script.log」になり、logsフォルダー内に保存されます。
  3. catchステートメントは、あらゆる種類の例外をキャッチしており、PDOエラーだけに制限されているわけではありません。

ここで問題が発生しました。ユーザーに表示してほしい例外をスローしたい場合(たとえば、「これは間違っています。agianを試してください」などの例外をスローしたい場合)はどうでしょうか。さて、私はこれを拡張した解決策を思いつきましたが、それはあなたの疑問ではありません。それでも知りたい場合は、私に知らせてください。

乾杯。

于 2012-11-03T04:47:55.913 に答える
0

try --catchは、phpで例外を処理する標準的な方法です...ここに示すように:PHP EXCEPTIONS

try{
    some code here
}catch(Exception $e){
    failed response here
}

編集して詳しく説明する:これは、例外をキャッチするための単なる方法です。捕まったらどうするかは、開発者に任された価値判断です。それが質問の内容である場合は、お詫び申し上げます。

于 2012-10-31T14:43:11.727 に答える
0

エラーをキャッチする独自の方法を見つける必要があります。私は使用しています

try { QUERY } catch(Exception $e) { Log and display error }
于 2012-10-31T14:44:06.097 に答える