主要是概念上的一些问题,感觉书里产得有点抽象。我的理解就是。。异常就是try{}catch(exception,name){}这样的格式。如果try{}里的代码块有问题。比如数组下标超了。打开的文件不存在等。。就会执行catch{}里面的代码 它的代码,知道是什么样的异常就在时面声明一个什么样的异常类。exception是所有异常在的父类,所以能解决所有的异常。 也就是说这个执行的模式和if(){}else{}有一定类似,只不过把if()真假或者了是否有异常问题。。 但是在对于throw new这个概念我不懂。说是抛出异常,我不是太明白具体的概念,应该 就是try抓到后就catch处理。。这个抛出是什么呢。。好象new出了一个对象。请问它在这里面主要的任务是什么。
在java、python等语言中,异常对于我们来说已经是必不可少的错误处理方式。异常处理是面向对象编程中的一种很强大的特性,然而很多PHPer对它不了解,甚至认为它会破坏代码结构。即使在很多开源项目中,也难以见到异常的踪影。那么,PHP中的异常,到底有没有意义呢? PHP有两种错误处理机制,一种是内置错误,一种是异常。 内置错误,包含error、warning、notice等错误类型。很多PHP的内置函数,和一些PHP扩展,都会使用这种类型的错误。此类错误的优势是处理起来比较方便。不重要的错误,可以通过配置php选项来忽略它。我们甚至可以通过set_error_handler()函数,来集中处理非致命的错误。但是,PHP的宽容往往会让程序员养成一个坏习惯,那就是在代码中留下大量warning、notice级别的错误。这样对程序的调试和后期维护带来很多不便。而且致命的错误(Fatal Error),是没有办法处理的。这也是PHP的一大硬伤。 在PHP中使用异常有以下优势: 一、异常能提高程序的健壮性。 在需要处理错误的场景,异常能让我们轻松掌控程序,采取相应的处理措施。并不是所有的异常都需要处理。在一些异常发生时,没有其他替代方案,这时我们可以记录一些错误日志,并让程序崩溃。在web应用里,我们可以给用户显示一个500错误页面来增强用户体验。一些PHP的开源库会提供大量的异常类型,这样会帮助我们快速找出代码错误,减少程序BUG。 二、异常处理能增强程序的可维护性。 函数应该有一系列的输入,并且有唯一的输出。在参数不正确、或者发生系统错误时,我们需要告知使用者发生了什么样的错误,便于使用者处理和记录。 利用返回值、引用变量来返回错误在PHP程序中很常见:function foo($var) { if (!is_int($var)) { return array(-1, '参数1必须是整数'); } if ($var <= 0) { return array(-2, '参数1必须大于0'); } return $var;} 这样的函数使用非常不方便。使用者需要通过判断函数的返回值,来确保程序是否正常运行。额外的逻辑判断,会降低程序的可读性。 假如函数被修改为这样:function foo($var) { if (!is_int($var)) { return array(-1, '参数1必须是整数'); } if ($var <= 0) { return array(-2, '参数1必须大于0'); } return array($var, '');} 这时你外层的判断逻辑就需要修改,是不是很麻烦? 使用异常,在执行失败时抛出异常,可以让函数的输出非常干净,避免额外的处理。减少了代码量,也增强了程序的可维护性。 三、使用异常有助于我们集中处理错误。 在程序抛出异常时,只要没有遇到try catch,异常会逐渐向函数调用堆栈顶层传递。这样我们不需要每一层都处理错误。我们可以在程序的入口处集中处理所有未处理的异常,有助于我们发现潜在的程序BUG。而一个只会返回正常处理结果和错误代码的函数,在其出错时不得不立即处理。如果我们想在代码顶层再处理这个错误,就不得不一层一层返回这个错误,给程序设计带来很多不便。 综上,我们应该尽量使用异常,保证程序的可靠性。是否可以解决您的问题?
这个问题我前几天也跟同事讨论过。我这么来解释把比如你调用了try catch ,数组超标,那程序怎么知道是数组超标呢,那肯定是数组类报出来的。而数组类里面,肯定是throw出来,你才能catch到,得到message,数组超标,但是如果数组类里面,直接catch了,就没有异常了!这样你调用数组即使超标了,你自己的catch是catch不到,因为没人抛出异常别人的回答太官话了,求采纳我的
throw new Exception('....');是用来抛出一个自定义错误 或者抛出当前错误给上一级的catch,比如你定义一个函数function test($a){ if($a==1) throw new Exception('error');}这样的话执行test(1)会抛出一个“error” 错误try{ test(2);test(1);}catch(exception,name){echo($name->getMessage());}