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的也可以, 请接受我的崇拜.
25 个解决方案
#1
伪码表示(忘了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)”没懂,所以没实现
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)”没懂,所以没实现
#2
忘了对齐:
并非没有,而仅仅是语言不同而已。
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, ...);
}
并非没有,而仅仅是语言不同而已。
#3
在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 工具类实现.
#4
学习了。 谢谢分享。
#5
谢谢楼主分享!
#6
就try except在所有语言实现来说,python本身没有做恶。
非要简洁的话,每一个步骤都可以写入函数。
非要简洁的话,每一个步骤都可以写入函数。
#7
谢谢楼主分享!
#8
谢谢楼主!!!!!
#9
谢谢楼主!!!!!
#10
谢谢楼主!!!!!!!!!!!
#11
#12
#13
学习了,谢谢分享
#14
#15
学习路过了。。。
#16
#17
#18
#19
#20
#21
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())
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())
#22
#23
#24
#25
学习了。 谢谢分享。
#1
伪码表示(忘了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)”没懂,所以没实现
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)”没懂,所以没实现
#2
忘了对齐:
并非没有,而仅仅是语言不同而已。
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, ...);
}
并非没有,而仅仅是语言不同而已。
#3
在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 工具类实现.
#4
学习了。 谢谢分享。
#5
谢谢楼主分享!
#6
就try except在所有语言实现来说,python本身没有做恶。
非要简洁的话,每一个步骤都可以写入函数。
非要简洁的话,每一个步骤都可以写入函数。
#7
谢谢楼主分享!
#8
谢谢楼主!!!!!
#9
谢谢楼主!!!!!
#10
谢谢楼主!!!!!!!!!!!
#11
#12
#13
学习了,谢谢分享
#14
#15
学习路过了。。。
#16
#17
#18
#19
#20
#21
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())
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())
#22
#23
#24
#25
学习了。 谢谢分享。