This topic created in 4429 days ago, the information mentioned may be changed or developed.
我现在就遇到一个问题,一个小程序,里面有许多判断,一步一步走的
比如检查用户输入的值,再去数据库去查,再去文件中查等等~~
如果用户输入正确,没有多大问题的
但你知道的,不要相信用户,如果只按正常的步骤来,显得程序不够健壮
但写一大堆if else,再加上python的缩进会不会让代码很难看?
难道用一大堆ry..catch?会不会有性能问题,代码也不太好看?
大家是怎么解决异常问题的?还是设计程序时尽量把每一种情况都考虑到?
24 replies 1970-01-01 08:00:00 +08:00  | | 1 akira Mar 28, 2014 还是设计程序时尽量把每一种情况都考虑到 |
 | | 2 qiayue Mar 28, 2014 6 直线,不要层层嵌套 if(错误情况1){ //错误1处理 return; } //正常情况1 ... if(错误情况2){ //错误2处理 return; } //正常情况2 ... if(错误情况3){ //错误3处理 return; } //正常情况3 ... 最终完成 |
 | | 3 roricon Mar 28, 2014 你可以把这些输入检查写成函数,缩进看起来会舒爽一些,也方便复用。 |
 | | 4 soruNis Mar 28, 2014 how about this:
interface ICheck{ boolean check(); void dealWith(); }
ICheck condition_One= new ICheck(){ boolean check(){...} void dealWith(){...} }; ...
List<ICheck> allCOncerns= new LinkedList<>(); allConcerns.add(condition_one); ...
for(ICheck condition : allConcerns){ if(condition.check()){ condition.dealWith(); } } |
 | | 6 dcoder Mar 28, 2014 逻辑分支多到一定程度,要上 state machine |
 | | 7 otakustay Mar 28, 2014 作为一个健壮的程序,不写if/else你就算catch了也无法进行精确的日志记录,比如错在哪什么错能不能从错误中恢复,所以if/else省不了 |
 | | 8 Monad Mar 28, 2014 via iPhone 跑个题 感觉用Haskell的我来处理应该非常简洁方便了 |
 | | 9 linuxer Mar 28, 2014 论 if else 的正确用法。 |
 | | 12 9hills Mar 28, 2014 以前我也自己判断,后来发现了WTForms |
 | | 13 hitsmaxft Mar 28, 2014 前端js多做限制 后端根据自动写好模块(比如拆分function), 个个模块各司其职 那么结果就是
try: result = [checker(x) for checker in checkerlist ] catch something
这是自己实现的,
更完善的就要用 高阶的form library和 model 进行校验 |
 | | 14 binux Mar 28, 2014 check_funcs = [check_username, check_password, check_email, ] for each in check_funcs: __try: ____ret = each(from_data) __except Exception, e: ____ret = False __if ret is not True: ____raise Error |
 | | 16 Akagi201 Mar 28, 2014 via iPhone 多态啊,if else不是被批判过吗 |
 | | 18 senghoo Mar 28, 2014 层层封装。一层一层调用。 |
 | | 19 halfelf Mar 28, 2014 如果是OOP,那么这就是典型的代码坏味道,连续对一个值判断if else if在OOP里的正确做法是多态,自动匹配派生类方法 |
 | | 20 shyrock Mar 28, 2014 我更喜欢chain of responsibility模式 |
 | | 21 wity_lv Mar 28, 2014 可以使用try catch. 用CAS做单点登陆的时候,Client端的错误处理使用的是try ... catch ...
try {
cas.login(token);
} catch (UserNotFoundException ex) { //... } catch (WrongPasswrdException ex) { //... } catch (AuthFailException ex) { //... }
// do success.
以上的Exception仅供说明用.
一定要用if else, 参考2楼,快速return的方式中断。 |
 | | 22 est Mar 28, 2014 1 看到LZ多个地方问了这个问题。好吧。其实就具体问题来说,对付用户登录这种逻辑判断就一个字能用+忍! |
 | | 23 konakona Mar 29, 2014 如果这些判断是可重复的,完全可以写进函数里。
function isA(){ if(){} } function isB(){ if(){} } ....
//////////////////
//调用部分
isA();
isB();
逻辑清晰可见。 |
 | | 24 davidli Apr 7, 2014 前几天刚看了腾讯在网站上控制用户登录的JS代码, 一个简单粗暴的for加if if if if if if if . 大意是: for all form.values if name="username": xxx if name="pswd" : xxx if name="mibao" : xxx if name="verifycode" : xxx |