我有以下代码,我想知道我是否可以使用try&赶上如下:
class fun_database implements idbInfo{
private $srvr=idbInfo::srvr_name;
private $usr=idbInfo::usrnm;
private $pass=idbInfo::psswrd;
private $db=idbInfo::db_name;
public function connct(){
$hookup = new mysqli($this->srvr, $this->usr, $this->pass, $this->db);
if ($hookup->connect_errno)
{
throw new Exception("Error Processing Request", 1);
}
}
public function sql_require_all($table_name, $table_col){
$hookup = new connct();
$result = $hookup->query("SELECT $table_col FROM $table_name");
if($hookup->error()){
throw new Exception("Error Processing Request", 1);
}
return $result->num_rows;
}
}
这是一个与mysql的简单连接,并在那里执行一些查询。这是以上函数的实际调用:
$conn = new fun_database();
try{
$result = $conn->sql_require_all('wordtypes', 'types');
}
catch(Exception $err){
echo "Problems at:". $err->getMessage();
}
return "<option>".$result."</option>";
我要问的是一点理论。很可能这段代码不工作(我还没有测试)。我只是想知道是否可以通过“尝试”'捕获'两个异常(因为你可以看到第一个'throw'在fun_database的第二个方法中,第二个'throw'在第一个方法中同一个对象只能从第二种方法调用。)
抱歉让它太复杂但仍然无法弄清楚这个try / catch的结构是否正常工作。
答案 0 :(得分:5)
你只能捕捉不同类型的例外......
class fun_database implements idbInfo{
private $srvr=idbInfo::srvr_name;
private $usr=idbInfo::usrnm;
private $pass=idbInfo::psswrd;
private $db=idbInfo::db_name;
public function connct(){
$hookup = new mysqli($this->srvr, $this->usr, $this->pass, $this->db);
if ($hookup->connect_errno)
{
throw new DomainException("Error Processing Request", 1);
}
}
public function sql_require_all($table_name, $table_col){
$hookup = new connct();
$result = $hookup->query("SELECT $table_col FROM $table_name");
if($hookup->error()){
throw new Exception("Error Processing Request", 1);
}
return $result->num_rows;
}
}
然后:
try{
$conn = new fun_database();
$result = $conn->sql_require_all('wordtypes', 'types');
}
catch(DomainException $err){
echo "This Problem at:". $err->getMessage();
}
catch(Exception $err){
echo "That Problem at:". $err->getMessage();
}
return "<option>".$result."</option>";
虽然我相信你会在try块中进行类实例化。
答案 1 :(得分:2)
它不会捕获这两个异常,因为只要抛出第一个异常,它就会直接进入catch块,从而直接跳过第二个异常。
你可以包装每个可能在自己的try-catch块中引发异常的代码。
答案 2 :(得分:2)
是和否。您的代码能够捕获两个异常,但不能同时捕获它们。当抛出异常之一时,程序执行将查找最接近的catch块,这适合捕获Exception
类。其余代码将被省略。
答案 3 :(得分:1)
您可以在程序中的某个点抛出异常(如果没有捕获,则不会在激活后抛出异常。)
一旦达到这一点,它就会停止并尝试回退到try catch块。一旦找到它就会阻止它(如果它是一个很好的捕获)
你可以尝试捕捉整个程序或只是一个功能。
答案 4 :(得分:1)
您可以抛出不同类别的异常:
class ConnectException extends Exception {}
class QueryException extends Exception {}
然后捕获不同的例外:
try {
// something
}
catch (ConnectException $ex) {
// connect exception
}
catch (QueryException $ex) {
// query exception
}
答案 5 :(得分:1)
这是不可能的,因为当你抛出
throw new Exception("Error Processing Request", 1);
此异常将在此行中捕获
catch(Exception $err){
echo "This Problem at:". $err->getMessage();
}
如果抛出第一个异常,你将无法到达可抛出另一个异常的行