我无法理解当我从类中调用函数时抛出并捕获异常。
请想象我的QuizMaker
课程如下:
// Define exceptions for use in class
private class CreateQuizException extends Exception {}
private class InsertQuizException extends Exception {}
class QuizMaker()
{
// Define the items in my quiz object
$quiz_id = null;
$quiz_name = null;
// Function to create a quiz record in the database
function CreateQuizInDatabase()
{
try
{
$create_quiz = // Code to insert quiz
if (!$create_quiz)
{
// There was an error creating record in the database
throw new CreateQuizException("Failed inserting record");
}
else
{
// Return true, the quiz was created successfully
return true;
}
}
catch (CreateQuizException $create_quiz_exception)
{
// There was an error creating the quiz in the database
return false;
}
}
function InsertQuestions()
{
try
{
$insert_quiz = // Code to insert quiz
if (!$insert_quiz)
{
// There was an error creating record in the database
throw new CreateQuizException("Failed inserting quiz in to database");
}
else
{
// Success inserting quiz, return true
return true;
}
}
catch (InsertQuizException $insert_exception)
{
// Error inserting question
return false;
}
}
}
...并使用此代码,我使用该类在数据库中创建新的测验
class QuizMakerException extends Exception {}
try
{
// Create a blank new quiz maker object
$quiz_object = new QuizMaker();
// Set the quiz non-question variables
$quiz_object->quiz_name = $_POST['quiz_name'];
$quiz_object->quiz_intro = $_POST['quiz_intro'];
//... and so on ...
// Create the quiz record in the database if it is not already set
$quiz_object->CreateQuizRecord();
// Insert the quiz in to the database
$quiz_object->InsertQuestions();
}
catch (QuizMakerException $quiz_maker_error)
{
// I want to handle any errors from these functions here
}
对于这段代码,如果任何函数没有执行我想要的函数(我们返回TRUE或FALSE),我想调用QuizMakerException
。
当此代码中的任何函数无法执行我想要的操作时,正确的方法是什么?目前他们只是返回TRUE或FALSE。
catch
我的函数中抛出了一个QuizMakerException?做什么是正确的?
帮助!
答案 0 :(得分:3)
通常在抛出异常的函数中,比如你的InsertQuestions
方法,你不想捕获任何异常,你想抛出它们或者让它们“冒泡”。然后你的“控制器”代码可以确定如何处理异常。
如果您的目标是在CreateQuizRecord
失败时暂停,我会将CreateQuizRecord
和InsertQuestions
分别包装在自己的try块中。
例外的一个优点是,他们可以告诉你的不仅仅是一个简单的布尔传递/失败。将基本异常扩展为诸如“Invalid_Parameter”之类的内容并测试特定异常,或者无理由地从异常属性推断。您可以嵌套catch块以单独处理异常。
我是否从函数的catch中抛出了一个QuizMakerException?
是。通常,// Code to insert quiz
下的代码本身会返回异常。假设模型未能插入它可能会引发数据库异常。在这种情况下,您可以让数据库异常冒泡,或者执行您现在正在执行的操作,并将其捕获,只是为了反过来抛出另一个异常(在某种程度上对您的异常有点愚蠢,尽管如此)。
我是否真的必须在调用每个函数之间放置大量的if / else语句,我认为这是异常的全部要点,它们只是暂停try / catch中的其他语句的执行?
我这样看,每次调用抛出一个异常,然后是一个后续调用,依赖于这个不抛出任何异常的调用,应该包含在try块中。假设你想要优雅地处理它,如果你只是想让它出错并停止只是不处理异常。你会得到一个错误和堆栈跟踪。有时这是可取的。
答案 1 :(得分:2)
您可能希望稍微更改结构。您的QuizMaker课程可以成为:
<?php
// Define exceptions for use in class
public class CreateQuizException extends Exception {}
public class InsertQuizException extends Exception {}
class QuizMaker()
{
// Define the items in my quiz object
$quiz_id = null;
$quiz_name = null;
// Function to create a quiz record in the database
function CreateQuizInDatabase()
{
try
{
$create_quiz = // Code to insert quiz
if (!$create_quiz)
{
// There was an error creating record in the database
throw new CreateQuizException("Failed inserting record");
}
else
{
// Return true, the quiz was created successfully
return true;
}
}
catch (Exception $create_quiz_exception)
{
// There was an error creating the quiz in the database
throw new CreateQuizException(
"Failed inserting record " .
$create_quiz_exception->getMessage()
);
}
}
function InsertQuestions()
{
try
{
$insert_quiz = // Code to insert quiz
if (!$insert_quiz)
{
// There was an error creating record in the database
throw new InsertQuizException("Failed inserting quiz in to database");
}
else
{
// Success inserting quiz, return true
return true;
}
}
catch (Exception $insert_exception)
{
// Error inserting question
throw new InsertQuizException(
"Failed inserting quiz in to database " .
$create_quiz_exception->getMessage()
);
}
}
}
实际上,如果无法正确插入记录,则会抛出Insert异常。如果该代码块出现任何问题,您将捕获它并再次抛出Insert异常。与Create函数(或您可能拥有的任何其他函数)相同。
在主代码块中,您可以:
try
{
// Create a blank new quiz maker object
$quiz_object = new QuizMaker();
// Set the quiz non-question variables
$quiz_object->quiz_name = $_POST['quiz_name'];
$quiz_object->quiz_intro = $_POST['quiz_intro'];
//... and so on ...
// Create the quiz record in the database if it is not already set
$quiz_object->CreateQuizRecord();
// Insert the quiz in to the database
$quiz_object->InsertQuestions();
}
catch (InsertQuizException $insert_exception)
{
// Insert error
}
catch (CreateQuizException $create_quiz_exception)
{
// Create error
}
catch (Exception $quiz_maker_error)
{
// Any other error
}
如果你不想在那里有多个catch块,只需保留catch(Exception),然后检查抛出的每个异常的类型,以指定从那里采取的动作。
HTH
答案 2 :(得分:0)
最好的办法是不必首先抛出异常。 程序崩溃并且不会处理错误的输出时会抛出异常。 如果你的函数返回任何东西(即使是错误的东西),它也不需要例外。
要回答你的问题,如果有必要使用大量的ifs / elses,那么你必须使用它们。