PHP中Exception异常处理类的使用详解

 更新时间:2016年11月25日 17:30  点击:1973
本文章介绍了在php中常用的简单的异常处理类,我们主要是讲述到了Exception处理 ,有需要了解的同学可参考一下。
 代码如下 复制代码
<?php
    try {
        $a=10/0;
    }catch (Exception $e){
        echo "抛出异常";
    }
?>

以上代码,并不会输出“抛出异常”,而是输出了错误信息:Warning: Division by zero in......

说明:try块中并没有抛出异常,而是按照系统默认的错误处理机制进行处理

所以能不能捕获到异常,取决于有没有真正的抛出异常

 

 代码如下 复制代码

<?php
class Exception
{
    protected $message = 'Unknown exception';   // 异常信息
    protected $code = 0;                        // 用户自定义异常代码
    protected $file;                            // 发生异常的文件名
    protected $line;                            // 发生异常的代码行号

    function __construct($message = null, $code = 0);

    final function getMessage();                // 返回异常信息
    final function getCode();                   // 返回异常代码
    final function getFile();                   // 返回发生异常的文件名
    final function getLine();                   // 返回发生异常的代码行号
    final function getTrace();                  // backtrace() 数组
    final function getTraceAsString();          // 已格成化成字符串的 getTrace() 信息

    /* 可重载的方法 */
    function __toString();                       // 可输出的字符串
}
?>

简单的使用如下:(通过异常,抛出错误信息)

 代码如下 复制代码

try {
    $error = 'my error!';
    throw new Exception($error)
} catch (Exception $e) {
    echo $e->getMessage();
}

我们可以扩展此类,方便我们的使用

 

 代码如下 复制代码

class MyException extends Exception
{
    // 重定义构造器使 message 变为必须被指定的属性
    public function __construct($message, $code = 0) {
        // 自定义的代码

        // 确保所有变量都被正确赋值
        parent::__construct($message, $code);
    }

    // 自定义字符串输出的样式
    public function __toString() {
        return __CLASS__ . ": [{$this->code}]: {$this->message}n";
    }

    public function customFunction() {
        echo "A Custom function for this type of exceptionn";
    }
}
  

异常处理的基本思想是代码在try代码被调用执行。如果try码块出现错误,我们可以执行一个抛出异常的处理。某些编程语言,如java,,在特定情况下将自动抛出异常。在php中,异常必须手动抛出。可以使用如下方式抛出一个异常:

 代码如下 复制代码

  Throw new Exception(‘message’,code);

  Throw 关键字将触发异常处理机制,它是一个语言结构,而不是一个函数,但是必须给它传递一个值。它要求一个接受对象。在最简单的情况下,可以实例化一个内置的Exception类。

  最后,在try代码之后,必须至少给出一个catch代码块。可以将多个catch代码块与一个try代码块进行关联。如果每个catch代码块可以捕获一个不同类型的异常,可以使用多个catch代码块是有意义的。例如,如果想捕获Exception类的异常,代码如下

 

 代码如下 复制代码

Catch(Exception $e)

{

   //handing exception

}

Catch代码捕获的对象就是导致异常并传递给throw语句的对象(被throw 语句抛出)。使用Exception 类的实例,是不错的选择。

Exception类提供了如下的内置方法:

  Getcode()      —返回传递给构造函数的代码。

  GetMessage()    —返回传递给构造函数的消息。

  getFile()     —返回产生异常代码的文件的路径

  getLine()    —返回产生异常的代码所在的行。
注意:

当捕获到一个异常后,try()块里面的后续代码将不会继续执行,而是会尝试查找匹配的“catch”代码块
 当抛出一个异常后,如果不进行catch处理,则会报“Uncaught exception 'Exception'”错误

 代码如下 复制代码
<?php
    function test($val){
        if ($val>100){
            throw new Exception("提示信息:您输入的值过大");
        }
    }
    test(111);
?>

  3.当一个异常抛出后,catch语句块可以进行处理也可以不处理

以下是我用户注册功能的部分代码

try{
     //check forms filled in
     if(!filled_out($_POST)){
         throw new Exception('你还没有填写表单,请回去填写');
     }
     //check email address not valid
     if(!check_email($email)){
        throw new Exception('邮件的格式不正确');
     }
     //检查密度的长度是否大于6
     if(strlen($passwd<6)){
         throw new Exception('密度的长度应该大于6');
     }
     //检查两次密码是否相等
     if($passwd!=$passwd1){
         throw new Exception('两次密码不一样,请重新输入');
     }
     //检查用户名的长度是否正确
     if(strlen($username)>16){
         throw new Exception('用户名的长度不符,请重新输入');
     }
  
 } catch(Exception $e){
     echo $e->getMessage(); //输出异常信息。
 }

 

php对异常的处理与java一样,用到的是try{}catch(){}

定义顶级异常处理器用到的函数是
set_exception_handler("My_exception");
这里的My_expection是开发者自定义的异常处理函数,既顶级异常处理器,只有当程序中没有函数来处理异常才有顶级异常处理器来处理异常,如果没有定义顶级异常处理器,则由系统默认的异常处理器来处理异常
举例说明:

 代码如下 复制代码
<meta http-equiv="content-type" content="text/html;charset=utf-8" /><?php
    set_exception_handler("My_expection");
    function My_expection(){
        echo "这里是顶级异常处理器";
    }
    try{
        nohello("hello");
    }catch(Exception $e){
        throw $e;
    }
  function nohello($nohello){
          if($nohello == "hello"){
              throw new Exception("不能输入hello");
          }else{
            echo "输入成功";
        }
    }
?>

 

文章介绍了关于phpexcel读写xls文件的方法代码,有需要了解的同学可以参考一下本教程哦。
 代码如下 复制代码

<?php
include_once('PHPExcel.php');
//read excel file;
$PHPExcel = new PHPExcel();    
$PHPReader = new PHPExcel_Reader_Excel5();
$PHPExcel = $PHPReader->load('/home/yuanjianjun/taobao_cat.xls');
$currentSheet = $PHPExcel->getSheet(0);
$allColumn = $currentSheet->getHighestColumn();
$allRow = $currentSheet->getHighestRow();
for($currentRow = 1; $currentRow<=$allRow; $currentRow++){
   for($currentColumn='A'; $currentColumn<=$allColumn; $currentColumn++){  
    $address = $currentColumn.$currentRow;  
    echo $currentSheet->getCell($address)->getValue()."t";  
   }
   echo "n";
}


//write excel file
$objExcel = new PHPExcel();
$objWriter = new PHPExcel_Writer_Excel5($objExcel);
$objProps = $objExcel->getProperties();  
$objProps->setCreator("yuan");
$objProps->setLastModifiedBy("yuan");
$objProps->setTitle("excel test");  
$objProps->setSubject("my excel test");
$objProps->setDescription("hello world.");  
$objProps->setKeywords("PHPExcel");
$objProps->setCategory("EXCEL");
$objExcel->setActiveSheetIndex(0);
$objActSheet = $objExcel->getActiveSheet();
$objActSheet->setTitle('TEST1');
$objActSheet->setCellValue('A1', '字符串内容');
$objActSheet->setCellValue('A2', 26);
$objActSheet->setCellValue('A3', true);
$objActSheet->setCellValue('A4', '=A2+A2');
$objWriter->save('/home/yuanjianjun/helloworld.xls');  


//copy excel format
$objReader = PHPExcel_IOFactory::createReader('Excel5');
$objPHPExcel = $objReader->load('/home/yuanjianjun/20100301.xls');
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->_phpExcel->setActiveSheetIndex(0);
$objWriter->_phpExcel->getActiveSheet()->setCellValue('A1', 'FESDF');
$objWriter->_phpExcel->getActiveSheet()->setCellValue('B1', 'S');
$objWriter->_phpExcel->getActiveSheet()->setCellValue('C1', 'FEFSD');
$objWriter->_phpExcel->getActiveSheet()->setCellValue('D1', 'SDFD');
$objWriter->_phpExcel->getActiveSheet()->setCellValue('E1', '淘宝CPS');
$objWriter->save('/home/yuanjianjun/copy.xls');

本文章这里是一个己排序好的二维数据,我们要向数组中插入一个元素这个保存到数据中后还需要进行排序的哦。
 代码如下 复制代码

<?php
/**
* 逆序二维数组插入一元素
*
* @author WadeYu
* @date 2012-05-30
*/
$aSorted = array(
array(1, 100),
array(2, 90),
array(3, 80),
array(4, 70),
array(5, 60),
array(6, 50),
array(7, 40),
array(8, 40),
array(9, 40),
array(10, 20),
);
$aInsert = array(11, 40);
$maxCmpIdx = 0;
$cnt = 0;
$maxCnt = 10;
foreach ($aSorted as $idx => $arr){
if ($arr[0] == $aInsert[0]){
$maxCmpIdx = $idx;
}
$cnt++;
}
if ( !$maxCmpIdx){
$maxCmpIdx = $cnt++;
}
$aSorted[$maxCmpIdx] = $aInsert;
for ($i = $maxCmpIdx; $i > 0; $i--){
if ($aSorted[$i][1] > $aSorted[$i-1][1]){
$aTmp = $aSorted[$i-1];
$aSorted[$i-1] = $aSorted[$i];
$aSorted[$i] = $aTmp;
continue ;
}
break;
}
for ($i = $cnt; $i > $maxCnt; $i--){
unset($aSorted[$i-1]);
}
print_r($aSorted);

在数组中插入元素的方法有很多,这里只介绍了一种,有需要了解更多的朋友可到本站搜索。

我们这里讲述的防盗链代码只专注于php的解决方案,当然如果你有服务器管理权限或htaccess文件操作我建义不要用php防盗链哦。

先来看个最简单的
下面是php实现的代码, xxx.mp3就是你的音乐文件的实际地址, 对外传播的时候只传播php地址,mp3地址对外不公开

 代码如下 复制代码
<?php
 if(strpos($_SERVER['HTTP_REFERER'], 'qq.com') !== FALSE) {
  header('HTTP/1.1 404 Not Found');
  exit;
 }
 readfile('xxx.mp3');
?>

可以加入白名单的做法

 

 代码如下 复制代码
<?php
/**
* @author seraphim
* @copyright 2012
*/
$ADMIN = array(
'defaulturl'=> 'http://www.xx.com/images/banner-header.gif', //盗链返回的地址
'url_1' => 'http://www.xx.net/file',
'url_2' => 'http://www.xx.net/file1',
);
$okaysites = array(
'http://box.baidu.com',
'http://tieba.baidu.com/p/1493336008', //白名单
'http://www.xx.com/1.html',
);
$reffer = $_SERVER['HTTP_REFERER'];
if ($reffer) {
$yes = 0;
while (list($domain, $subarray) = each($okaysites)) {
if (ereg($subarray, "$reffer")) {
$yes = 1;
}
}
$theu = 'url_' . $_GET['site'];
$file = $_GET['file'];
if ($ADMIN[$theu] and $yes == 1) {
header("Location: $ADMIN[$theu]/$file");
} else {
header("Location: $ADMIN[defaulturl]");
}
} else {
header("Location: $ADMIN[defaulturl]");
}
print_r($_SERVER['HTTP_REFERER']);
?>

实例3 [支持白名单二]

 代码如下 复制代码

<?php

$ADMIN[defaulturl] = "http://www.111cn.net/404.htm";//盗链返回的地址
$okaysites = array("http://www.111cn.net/","http://111cn.net"); //白名单
$ADMIN[url_1] = "http://www.111cn.net/download/";//下载地点1
$ADMIN[url_2] = "";//下载地点2,以此类推

$reffer = $HTTP_REFERER;
if($reffer) {
$yes = 0;
while(list($domain, $subarray) = each($okaysites)) {
if (ereg($subarray,"$reffer")) {
$yes = 1;
}
}
$theu = "url"."_"."$site";
if ($ADMIN[$theu] AND $yes == 1) {
header("Location: $ADMIN[$theu]/$file");
} else {
header("Location: $ADMIN[defaulturl]");
}
} else {
header("Location: $ADMIN[defaulturl]");
}

?> 

还有很多的方法来实现防盗链本文章只讲到了利用php实现,像有些站生成了html这样做起来就不怎么方便了,我们可以在iis,apache,htaccess来操作。

本文章来介绍一篇关于标签云的生活方法,我们利用php和mysql做实现,有需要的同学可参考一下。

用户输入文本和输入的文本在过去的一个标签云 。标签云是一个用户生成的标签的可视化描述,或只是一个网站的文字内容,通常用来描述网站的内容。

为此,我们将创建一个HTML表格,将接受用户文本,也让用户可以看到从 MySQL数据库,其中包含在过去输入的文本生成的标签云。

 代码如下 复制代码
<?php
 echo '<form method="post" action="tag_cloud_gen.php" name="gen_tag_db">';
 echo '<p>Input your text here:<br /><textarea name="tag_input" rows="20" cols="80"></textarea></p>';
 echo '<input type="submit" name="submit">';
 echo '</form>';
?>
<br />
<h3>OR</h3>
<br />
<p>see the current tag cloud here</p>
<?php
 echo '<form name="show_tag_cloud" method="post" action="show_tag_cloud.php">';
 echo '<input type="submit" value="show current tag cloud" >';
 echo '</form>';
?>

其中每个计算其频率和对将进入一个数组,输入的文本将被表征为单个词。然后将这个数组存储到一个MySQL数据库,我们可以选择保存在MySQL数据库表coloumn存储任何链接,如果这个项目未来的扩展。

1) tag_id —- int,primary key,auto increament 1)tag_id - 整型,主键,自动increament

2) keyword — varchar(20),unique 2)关键字 - 数据类型为varchar(20),独特的

3) weight — int 3)重量 - 诠释

4) link — varchar(256). 4)链接 - 为varchar(256)。

 

 代码如下 复制代码

<?php
///////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* this function will update the mysql database table to reflect the new count of the keyword
* i.e. the sum of current count in the mysql database &amp;amp;amp;amp;amp; current count in the input.
*/
function update_database_entry($connection,$table,$keyword,$weight){

 $string=$_POST['tag_input'];
 $connection = mysql_connect("localhost", "root", "");
 /**
 * now comes the main part of generating the tag cloud
 * we would use a css styling for deciding the size of the tag according to its weight,
 * both of which would be fetched from mysql database.
 */

 $query="select * from `tagcloud_db`.`tags` where keyword like '%$keyword%'";
 $resultset=mysql_query($query,$connection);

 if(!$resultset){
  die('Invalid query: ' . mysql_error());
 } else {
  while($row=mysql_fetch_array($resultset)){
  $query="UPDATE `tagcloud_db`.`tags` SET weight=".($row[2]+$weight)." where tag_id=".$row[0].";";
  mysql_query($query,$connection);
 }
}
}
?>
<?php
/*
* get the input string from the post and then tokenize it to get each word, save the words in an array
* in case the word is repeated add '1' to the existing words counter
*/
 $count=0;
 $tok = strtok($string, " t,;.'"!&-`nr");//considering line-return,line-feed,white space,comma,ampersand,tab,etc... as word separator
 if(strlen($tok)>0) $tok=strtolower($tok);
 $words=array();
 $words[$tok]=1;
 while ($tok !== false) {
  echo "Word=$tok<br />";
  $tok = strtok(" t,;.'"!&-`nr");
  if(strlen($tok)>0) {
  $tok=strtolower($tok);
  if($words[$tok]>=1){
   $words[$tok]=$words[$tok] + 1;
  } else {
   $words[$tok]=1;
  }
 }
}
print_r($words);
echo '<br /><br />';
/**
* now enter the above array of word and corresponding count values into the database table
* in case the keyword already exist in the table then update the database table using the function 'update_database_entry(...)'
*/
$table="tagcloud_db";
mysql_select_db($table,$connection);
foreach($words as $keyword=>$weight){
 $query="INSERT INTO `tagcloud_db`.`tags` (keyword,weight,link) values ('".$keyword."',".$weight.",'NA')";
 if(!mysql_query($query,$connection)){
  if(mysql_errno($connection)==1062){
   update_database_entry($connection,$table,$keyword,$weight);
  }
 }
}
mysql_close($connection);
?>

Make anether file and name it style.css .做出anether文件和将其命名为style.css文件。 Put the following code in it.把下面的代码。

 代码如下 复制代码

HTML, BODY
{
padding: 0;
border: 0px none;
font-family: Verdana;
font-weight: none;
}
.tags_div
{
padding: 3px;
border: 1px solid #A8A8C3;
background-color: white;
width: 500px;
-moz-border-radius: 5px;
}
H1
{
font-size: 16px;
font-weight: none;
}
A:link
{
color: #676F9D;
text-decoration: none;
}
A:hover
{
text-decoration: none;
background-color: #4F5AA1;
color: white;
}

这将使我们的标签云外观漂亮,它保存为style.css的。
再次,使一个新的PHP文件,并命名它show_tag_cloud.php。
在PHP代码中,如下我们连接到MySQL数据库,获取所有的标签,其重量和纽带。

然后计算每个使用它的重量及最小的标签大小假定为标签的大小,它也是每一个标签从数据库中检索或与Google链接,如果没有链接存在,即“不适用”的链接

 代码如下 复制代码

<?php
 $connection = mysql_connect("localhost", "root", "");
 $table="tagcloud_db";
 $words=array();
 $words_link=array();
 mysql_select_db($table,$connection);
 $query="SELECT keyword,weight,link FROM `tagcloud_db`.`tags`;";

 if($resultset=mysql_query($query,$connection)){
  while($row=mysql_fetch_row($resultset)){
   $words[$row[0]]=$row[1];
   $words_link[$row[0]]=$row[2];
  }
 }
// Incresing this number will make the words bigger; Decreasing will do reverse
$factor = 0.5;

// Smallest font size possible
$starting_font_size = 12;

// Tag Separator
$tag_separator = '&nbsp; &nbsp; &nbsp;';
$max_count = array_sum($words);

?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
 <HEAD>
  <TITLE> Tag Cloud Generator </TITLE>
  <META NAME="Keywords" CONTENT="tag, cloud, php, mysql">
  <META NAME="Description" CONTENT="A Tag Cloud using php and mysql">
  <LINK REL="stylesheet" HREF="style.css" TYPE="text/css">
 </HEAD>
<BODY>
<center><h1>Tag Cloud using php and mysql </h1><div align='center' class='tags_div'>
<?php
foreach($words as $tag => $weight )
{
 $x = round(($weight * 100) / $max_count) * $factor;
 $font_size = $starting_font_size + $x.'px';
 if($words_link[$tag]=='NA') echo "<span style='font-size: ".$font_size."; color: #676F9D;'><a href='http://www.google.co.in/search?hl=en&q=".$tag."&meta='>".$tag."</a></span>".$tag_separator;
 else echo "<span style='font-size: ".$font_size."; color: #676F9D;'><a href='http://".$words_link[$tag]."/'>".$tag."</a></span>".$tag_separator;
}
?>
</div></center>
</BODY>
</HTML>

现在把他们所有在您的Web服务器的根目录,并观看结果。 每个查询会给你新的结果,随着时间的推移,数据库的增长。

[!--infotagslink--]

相关文章

  • C#多线程中的异常处理操作示例

    这篇文章主要介绍了C#多线程中的异常处理操作,涉及C#多线程及异常的捕获、处理等相关操作技巧,需要的朋友可以参考下...2020-06-25
  • C#异常处理中try和catch语句及finally语句的用法示例

    这篇文章主要介绍了C#异常处理中try和catch语句及finally语句的用法示例,finally语句的使用涉及到了C#的垃圾回收特性,需要的朋友可以参考下...2020-06-25
  • C#异常处理详解

    这篇文章介绍了C#异常处理,有需要的朋友可以参考一下...2020-06-25
  • C++异常处理入门(try和catch)

    C++ 提供了异常机制,让我们能够捕获运行时错误,本文就详细的介绍了C++异常处理入门,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-08-09
  • C++之异常处理详解

    C++中处理异常的过程是这样的:在执行程序发生异常,可以不在本函数中处理,而是抛出一个错误信息,把它传递给上一级的函数来解决,上一级解决不了,再传给其上一级,由其上一级处理...2020-04-25
  • Python 异常处理总结

    阅读本篇文章以学习 Python 异常处理。它应该可以帮助您了解如何在程序中使用 try、except 和 finally 语句。下面跟着小编一起来学习文章内容吧...2021-09-24
  • 轻松学习C#的异常处理

    轻松学习C#的异常处理,对C#的异常处理感兴趣的朋友可以参考本篇文章,帮助大家更灵活的运用C#的异常处理。...2020-06-25
  • php 错误处理与异常处理方法与实例教程(1/2)

    在程序开发中,错误处理这一块是非常重要的,今天本文章就来告诉他关于在php开发中,错误处理函数并且举例说明错误处理的重要性。 1、内置异常处理类。 2、捕获并...2016-11-25
  • C#图片处理类分享

    这篇文章主要为大家分享了C#图片处理类的相关代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • C#异常处理的一些经验和技巧

    本文是异常处理经验性的文章,其实跟C#关系也不大。比较适合刚刚熟悉异常语法,而缺乏实战的读者。当然,经验老练的读者也可指出不足、给予意见、补充说明,一起完善文章,分享更多知识与经验...2020-06-25
  • c++异常处理机制示例及详细讲解

    本篇文章主要是对c++异常处理机制示例进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助...2020-04-25
  • php图片处理类:缩略,裁剪,圆角,倾斜(1/3)

    本文章免费提供一款php图片处理类:缩略,裁剪,圆角,倾斜代码,他可以切出不同风格的图片哦,哈哈,比其它的在线切图要好很多了哦。 代码如下 复制代码 ...2016-11-25
  • asp.net字符串处理类代码

    asp.net字符串处理类代码,需要的朋友可以参考下...2021-09-22
  • C++异常处理 try,catch,throw,finally的用法

    这篇文章主要介绍了C++异常处理 try,catch,throw,finally的用法,需要的朋友可以参考下...2020-04-25
  • PHP5的异常处理机制之使用Throw关键字

    建立一个Exception对象后你可以将对象返回,但不应该这样使用,更好的方法是用throw要害字来代替。throw用来抛出异常: throw new Exception("my message", 44 );  ...2016-11-25
  • 新作模板处理类,有兴趣的可以试试

    pfcTemplate 主要特点 1. 高效率 因为程序中分析变量、区块时没有采用正规表达式去做,而采用PHP内置字符串 处理函数来做,所以效率可能会稍高于同类产品 2. 易用性 使用...2016-11-25
  • PHP中Exception异常处理类的使用详解

    本文章介绍了在php中常用的简单的异常处理类,我们主要是讲述到了Exception处理 ,有需要了解的同学可参考一下。 代码如下 复制代码 <?php ...2016-11-25
  • 一文搞懂python异常处理、模块与包

    异常就是系统中的错误,程序是无法改变和处理的,文中有给大家提到异常处理机制,模块与包的相关知识,通过实例代码给大家介绍的非常详细,需要的朋友参考下吧...2021-06-26
  • Android APP应用开发中异常处理

    在Android应用程序开发中,不可避免的会出现异常,我们应该如何快速的在开发阶段捕获异常进行处理呢?在Java线程类中,可以在线程中捕捉未处理异常,本文我们详细介绍。 AP...2016-09-20
  • 非常实用的C#字符串操作处理类StringHelper.cs

    这篇文章主要为大家详细介绍了非常实用的C#字符串操作处理类StringHelper.cs,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25