kotlin中的惯用异常处理
处理异常时,我发现自己需要这个方便的小功能:kotlin中的惯用异常处理,kotlin,exception,Kotlin,Exception,处理异常时,我发现自己需要这个方便的小功能: inline-fun-exec(lambda:()->Any):Boolean=try{lambda();true}catch(e:Exception){false} Kotlin中是否存在类似的函数? 繁重的try-catch-finnaly语法是否有惯用的替代方法?您可以使用runCatching,然后对结果使用。issucess获得布尔值以获得成功 runCatching { // your code }.isSuccess 如果您
inline-fun-exec(lambda:()->Any):Boolean=try{lambda();true}catch(e:Exception){false}
Kotlin中是否存在类似的函数?
繁重的try-catch-finnaly语法是否有惯用的替代方法?您可以使用
runCatching
,然后对结果使用。issucess
获得布尔值以获得成功
runCatching {
// your code
}.isSuccess
如果您的代码需要一个结果,并且希望在失败时返回null(这是习惯用法的Kotlin),那么您可以这样做
val foo: Foo? = runCatching {
// your code that produces a Foo
}.getOrNull()
出于好奇:您的用例是什么?就我个人而言,我更喜欢异常,而不是只返回
成功的
布尔值的函数,因为在不同的错误场景中可以抛出不同的异常,从而允许不同的错误处理。 如果抛出异常,您如何判断出错的原因? 您的函数完全吞咽异常,甚至不记录它。 所以,无法找出抛出了什么异常、抛出在哪里,或者包含了什么消息。 (如果你假设只有一件事情可能出错,那么你很可能错过了一些东西……) 这样的函数使调试编码问题或处理多种类型的错误条件变得不可能……它还需要(但不强制)直接调用方检查返回值,然后在那里处理它,或者将它返回给调用方,等等。 最后,它要求lambda返回一个不可为null的值,然后忽略它。在某些情况下,当与Java代码交互时,可能需要将异常抛出代码包装为在失败时仅返回null的内容。但通常情况下,您只希望包装您预期的特定异常,如IllegalArgumentException
和NumberFormatException
,作为一种吞咽不需要记录的异常的方法,因为它们表示您预期可能发生的事情,就像您传递用户输入以进行某种验证一样。@vatbub这就像是kotlin val isAudio=isAudioFile(source)&&exec{m.setDataSource(source.canonicalPath)}
setDataSource在数据可用性出现任何问题时会抛出的那样