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

时间:2022-12-18 12:33:19
看了很多资料发现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的也可以, 请接受我的崇拜.

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)”没懂,所以没实现

#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


本帖最后由 windyforest 于 2017-09-06 14:13:50 编辑
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 工具类实现.

#4


学习了。 谢谢分享。

#5


谢谢楼主分享!

#6


就try except在所有语言实现来说,python本身没有做恶。
非要简洁的话,每一个步骤都可以写入函数。

#7


谢谢楼主分享!

#8


谢谢楼主!!!!!

#9


谢谢楼主!!!!!

#10


谢谢楼主!!!!!!!!!!!

#11


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

#12


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

#13


学习了,谢谢分享

#14


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

#15


学习路过了。。。

#16


该回复于2017-09-13 15:27:34被管理员删除

#17


该回复于2017-09-16 16:08:41被管理员删除

#18


该回复于2017-09-16 16:08:41被管理员删除

#19


该回复于2017-09-16 16:08:41被管理员删除

#20


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

#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())

#22


该回复于2017-10-08 17:10:30被管理员删除

#23


该回复于2017-10-08 17:10:30被管理员删除

#24


该回复于2017-10-12 08:41: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)”没懂,所以没实现

#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


本帖最后由 windyforest 于 2017-09-06 14:13:50 编辑
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 工具类实现.

#4


学习了。 谢谢分享。

#5


谢谢楼主分享!

#6


就try except在所有语言实现来说,python本身没有做恶。
非要简洁的话,每一个步骤都可以写入函数。

#7


谢谢楼主分享!

#8


谢谢楼主!!!!!

#9


谢谢楼主!!!!!

#10


谢谢楼主!!!!!!!!!!!

#11


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

#12


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

#13


学习了,谢谢分享

#14


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

#15


学习路过了。。。

#16


该回复于2017-09-13 15:27:34被管理员删除

#17


该回复于2017-09-16 16:08:41被管理员删除

#18


该回复于2017-09-16 16:08:41被管理员删除

#19


该回复于2017-09-16 16:08:41被管理员删除

#20


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

#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())

#22


该回复于2017-10-08 17:10:30被管理员删除

#23


该回复于2017-10-08 17:10:30被管理员删除

#24


该回复于2017-10-12 08:41:24被管理员删除

#25


学习了。 谢谢分享。