想了解一下try catch在php中的应用情况
阿神
阿神 2017-04-11 09:05:32
[PHP讨论组]

是这样,我们公司之前的项目大多表单采集采用表单提交的形式,然后呢方法里用try catch的机制,这样的做法我觉得很不错。但是我本人表单提交喜欢用ajax,这里就是我用ajax好像用不了try catch这样的机制,因为我要返回状态码。
请问try catchphp中的应用范围?应用多吗?如果我用ajax想达到类似于try catch的机制可以做到吗


大概我所用的文字描述,有点迷惑,那我就来些数据说明一下

try catch机制,代码如下:

try {
    //这里接收一下表单数据 表单提交/ajax提交
    $admin_data = $this->input->post();
    if( empty( $admin_data['name'] ) ) throw new Exception( '用户名不能为空啊喂', 0 );
    if( empty( $admin_data['passwd'] ) ) throw new Exception( '密码也不能为空啊喂', 0 );
} catch ( Exception $e ) {
    init_messagebox( $e->getMessage(), 'error', $e->getCode() );
}

看上面的throw new Exception这个位置可以替换成 ajax_return()

funtion ajax_return($state, $msg) {
    exit(json_encode(array('state'=>$state, 'msg'=>$msg)));
}

好像就是说try catch的机制也是用if来判断的,if捕获错误信息(错误信息还是自己定义的),那我直接就用if ajax_return()这样的组合就好了。为什么还要写那么多代码呢?是这里不太明白

是我自身对try catch的机制了解的太浅薄了,所以可能问题有些让人疑惑,望解答

阿神
阿神

闭关修行中......

全部回复(9)
黄舟

看上去题主是前端在和PHP后端配合

我觉得你得先搞清楚ajax,http的概念,搞清楚js和php/后端语言的关系

服务端是不是try catch风格和你和服务端的整合没有任何关系

另外建议你先去学明白前后端分离,然后尽量说服php后端(尤其他们的leader)也学一下应用起来,感觉你们现在可能是form submit+前后端完全不分离的模式,这个模式很疼很坑而且很落后

PHP中文网

返回不了状态码是不可能的,你应该是业务逻辑跳过了什么地方。使用 try catch 是良好的 OOP 风格的错误处理方式,应用广泛,在 PHP 的框架中也多有使用。

大家讲道理

ajax最终还是会到一个php请求里吧 在这个请求里用try catch

巴扎黑

我猜你可能是从一个异步的方法里直接获取了返回值,那个时候其实还没获取到呢。 跟TRY CATACH应该没关系。

大家讲道理
try{
    ...
    $this->endSuccess();
}catch(\Exception $e){
    $this->endError();
}

额,可能一开始遇到的比较顺利,所以其实题主遇到的情况不是很能理解(因为我一开始接触就是别人封装好的框架,状态码及其他要返回的数据可以封装在endSuccess方法中,如果要用ajax就在try{}里做判断,对ajax提交的数据做判断即可)

伊谢尔伦

参考Laravel
先定义异常处理器
set_error_handler
set_exception_handler
register_shutdown_function

然后在处理器里,判断是否是ajax请求
如果是ajax请求 ,返回固定的json格式

阿神

catch 到异常之后的处理由你来决定,并不一定要把异常throw出来,可以根据你的业务要求来定制json内容来返回、并且状态设置为异常号码。也可以修改http 状态码来做返回。

天蓬老师

你们现在业务逻辑比较简单,所以可以在一个方法里面用ajax_return,但是在复杂逻辑中会出现模块A调用模块B,模块B调用模块C,这时候模块C出错了,你该怎么把错误传递给最初始调用的模块,这时候就可以通过try catch的机制去捕获更深层次调用的错误,在所有模块都是自己开发的情况下用ajax_return虽然也可以,但是当程序不是作为ajax的接口时呢,总不能也通过ajax_return进行返回吧,通过catch exception,可以让开发者统一的处理这些错误,它可以作为ajax接口返回,也能作为其他应用返回,只需要在捕获的时候做出特定的处理就行了,而且最重要的是,现在市面上大部分成熟的库都是抛出异常,让上层应用去进行错误处理,要想跟这些库兼容,利用好try catch机制是很有必要的

伊谢尔伦

建议你去看看这篇文章、php5和php7的异常处理机制
PHP7系列之-异常处理

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号