如何在不中止序列的情况下仅捕获特定类型的异常
How to catch only specific type of exception without abort the sequence
RxJs 似乎没有 catch()
方法的变体,它只允许捕获特定类型的异常。但是很多时候我发现自己处于需要这样的操作员的情况。
例如,成像我需要解析日志文件的每一行并打印解析的消息。日志文件的某些行可能已损坏,但我真的不在乎,只想为该行输出一个 "Log message corrupted" 并继续下一行。
如果 catch()
确实允许我们指定特定类型的错误来捕获并传递所有其他错误,那么我们就可以像下面的伪代码那样做一些事情
readLogs()
.flatMap parseLog
.catchOnly ParseError, () ->
'Log message corrupted'
.subscribe (logMessage) ->
console.log logMessage
我想知道考虑到 catach()
的当前限制,RxJs 这样做的正确方法是什么。
catch/catchOnly 操作的功能有限。
Observable 链中较低的 link 无法告诉较高的 link 忽略错误。在 flatMap parseLog 传递错误后,它就完成了,并且 catchOnly 没有机制告诉它回溯并忽略该错误。
这意味着 catchOnly 操作最多只能在发现特定错误时重新启动序列。
为了达到您正在寻找的效果并保持序列继续,flatMap parseLog 应该首先避免产生错误条件。所以 parseLog 需要一个包装器来捕获 ParseError 异常并将其转换为有效的 logMessage。
您需要嵌套 catch
以防止错误终止整个链,并且您需要分离 拆分 和 [=14] 的逻辑=]解析行:
import {of, throwError} from 'rxjs'
import {flatMap, map, catchError} from 'rxjs/operators'
function handleErrors(e) {
return (e instanceof ParseError) ?
of("Log message corrupted") : throwError(e);
}
readLogs().pipe(
flatMap(splitLines)
flatMap(line =>
of(line).pipe(
map(parseLine),
catch(handleErrors)
)
)
)
.subscribe(
parsedLine => console.log(parsedLine),
e => console.error('Fatal error: ' + e);
);
.catch(error => {
if (whatever) {
console.log('I handle this in a cool way')
return Observable.empty(); // Or an observable that emits whatever you want
} else {
return Observable.throw(error);
}
RxJs 似乎没有 catch()
方法的变体,它只允许捕获特定类型的异常。但是很多时候我发现自己处于需要这样的操作员的情况。
例如,成像我需要解析日志文件的每一行并打印解析的消息。日志文件的某些行可能已损坏,但我真的不在乎,只想为该行输出一个 "Log message corrupted" 并继续下一行。
如果 catch()
确实允许我们指定特定类型的错误来捕获并传递所有其他错误,那么我们就可以像下面的伪代码那样做一些事情
readLogs()
.flatMap parseLog
.catchOnly ParseError, () ->
'Log message corrupted'
.subscribe (logMessage) ->
console.log logMessage
我想知道考虑到 catach()
的当前限制,RxJs 这样做的正确方法是什么。
catch/catchOnly 操作的功能有限。
Observable 链中较低的 link 无法告诉较高的 link 忽略错误。在 flatMap parseLog 传递错误后,它就完成了,并且 catchOnly 没有机制告诉它回溯并忽略该错误。
这意味着 catchOnly 操作最多只能在发现特定错误时重新启动序列。
为了达到您正在寻找的效果并保持序列继续,flatMap parseLog 应该首先避免产生错误条件。所以 parseLog 需要一个包装器来捕获 ParseError 异常并将其转换为有效的 logMessage。
您需要嵌套 catch
以防止错误终止整个链,并且您需要分离 拆分 和 [=14] 的逻辑=]解析行:
import {of, throwError} from 'rxjs'
import {flatMap, map, catchError} from 'rxjs/operators'
function handleErrors(e) {
return (e instanceof ParseError) ?
of("Log message corrupted") : throwError(e);
}
readLogs().pipe(
flatMap(splitLines)
flatMap(line =>
of(line).pipe(
map(parseLine),
catch(handleErrors)
)
)
)
.subscribe(
parsedLine => console.log(parsedLine),
e => console.error('Fatal error: ' + e);
);
.catch(error => {
if (whatever) {
console.log('I handle this in a cool way')
return Observable.empty(); // Or an observable that emits whatever you want
} else {
return Observable.throw(error);
}