python语言下非常不优雅的error handling

Ivar_PredixCN 2017-09-06 11:14:04
加精
看了很多资料发现Python下面的error handling就只有:

try:
.....
except xx as e:
.....
else:
.....
finally:
.....

代码巨长巨丑无比, 还谈什么优雅?

为什么不能fp一点, 类似:

Try(()=> doSth()).onSuccess(result => handleResult(result)).onFailure(e => handleException(e)).getOrElse(sth)


我尝试自己写一个类似的error handling工具类, 但发现python语言的动态特性, pattern match是没法实现的, type check也很弱, 所以没办法用静态语言的思路写出来, 如果谁知道怎么在python下面实现类似scala语言error handling风格的请告诉我, 或者知道类似的package的也可以, 请接受我的崇拜.
...全文
3822 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
lj7108 2017-10-14
  • 打赏
  • 举报
回复
学习了。 谢谢分享。
李子无为 2017-09-28
  • 打赏
  • 举报
回复
RxPY是否可以解决楼主关于优雅的问题? from rx import Observable, Observer class PrintObserver(Observer): def on_next(self, value): print("Received {0}".format(value)) def on_completed(self): print("Done!") def on_error(self, error): print("Error Occurred: {0}".format(error)) source = Observable.from_(["Alpha", "Beta", "Gamma", "Delta", "Epsilon"]) source.subscribe(PrintObserver())
nettman 2017-09-18
  • 打赏
  • 举报
回复
jdqswust 2017-09-12
  • 打赏
  • 举报
回复
学习路过了。。。
qq_38120180 2017-09-11
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
kuning1990 2017-09-08
  • 打赏
  • 举报
回复
学习了,谢谢分享
zyhxixixx 2017-09-08
  • 打赏
  • 举报
回复
aierda 2017-09-07
  • 打赏
  • 举报
回复
谢谢楼主!!!!!
leo_demo 2017-09-07
  • 打赏
  • 举报
回复
谢谢楼主!!!!!!!!!!!
码农小Q 2017-09-06
  • 打赏
  • 举报
回复
谢谢楼主!!!!!
qq_28892171 2017-09-06
  • 打赏
  • 举报
回复
谢谢楼主分享!
JackLu-csdn 2017-09-06
  • 打赏
  • 举报
回复
就try except在所有语言实现来说,python本身没有做恶。 非要简洁的话,每一个步骤都可以写入函数。
不夜流苏丶 2017-09-06
  • 打赏
  • 举报
回复
谢谢楼主分享!
hugh_z 2017-09-06
  • 打赏
  • 举报
回复
学习了。 谢谢分享。
Ivar_PredixCN 2017-09-06
  • 打赏
  • 举报
回复
storyhare, 谢谢回答.
在scala里面Try的类型签名是sealed abstract class Try[+T]

所以, getOrElse(else) 是有type check的, 它的意思是如果Try(()=> doSth()) 里面doSth()成功返回一个T类型, 则返回doSth()的值, 否则返回else这个值, 并且编译器会保证else必须是T类型的.
因为Python没有泛型的type check所以这个feature是没办法实现的

你的实现里面用到了成员变量的二次赋值来存储状态, 不过思路很不错的.
另外基于这个实现还可以加入filter, foreach, map, flatMap, thenTry, recover, transform等操作, 不过应该所有入口参数都没办法做类型的type check了, 可以勉强算作一个scala弱化版的Try error handling 工具类实现.

storyhare 2017-09-06
  • 打赏
  • 举报
回复
忘了对齐:

class Handler{
      function Handler(func){
            try{
                  this.result = func(...);
                  this.succeed = true;
            }
            catch{
                  this.succeed = false;
                  this.error = Exception.catched();
            }
      }
      function onSucceed(func){
            if(this.succeed){
                  func(this.result);
            }
            return this;
      }
      function onFailed(func){
            if(!this.succeed){
                  func(this.error);
            }
            return this;
      }
}

function Handle(func)
{
      return new Handler(func, ...);
}
并非没有,而仅仅是语言不同而已。
storyhare 2017-09-06
  • 打赏
  • 举报
回复
伪码表示(忘了Python语法): class Handler{ function Handler(func){ try{ this.result = func(...); this.succeed = true; } catch{ this.succeed = false; this.error = Exception.catched(); } } function onSucceed(func){ if(this.succeed){ func(this.result); } return this; } function onFailed(func){ if(!this.succeed){ func(this.error); } return this; } } function Handle(func) { return new Handler(func, ...); } ps: “getOrElse(sth)”没懂,所以没实现

163

社区成员

发帖
与我相关
我的任务
社区描述
GE的Predix平台整合云计算可扩展性、大数据管理和高级分析技术来助力新一代的数字化企业。结合GE自己作为全球工业界领导者的经验,Predix云平台为开发高级工业应用程序提供可连接性、安全和高性能。
云计算大数据 技术论坛(原bbs)
社区管理员
  • GE Predix工业互联网开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧