以下哪项是返回null的最佳实践:未行程的例外状况:范围错误(索引):无效值:不在0..2范围内我的代码:
late final int? element; try { element = l[index]; } catch(e) { element = null; }
正在寻找更短的一行程序解决方案。类似于:
final element = l[index] ?? null;
j2qf4p5b1#
错误的最佳实践是不引发错误。在这种情况下,我会这样做:
final T? element = (index >= 0 && index < l.length) ? l[index] : null;
不需要late,不会引发或捕获错误。如果一个错误被抛出,它可能是程序中的一个 * 真实 * 错误。如果您捕获并忽略了您预期的错误,您可能也捕获了您没有预期的错误,并隐藏了真实的问题。这就是捕获错误作为"正常控制流"的一部分不受欢迎的真正原因。这也是为什么你应该总是从API抛出(并记录)精确的异常类型,这样用户就可以进行精确的捕获。
late
lyr7nygr2#
希望这个答案能让你满意。:)
final int? element = (index == null || index.clamp(0,l.length - 1) != index) ? null : l[index];
nlejzf6q3#
您可以使用extension method:
我的扩展名.dart:
extension NullableList<T> on List<T> { T? nullable(int index){ T? element; try { element = this[index]; } catch(_) { } return element; } }
使用它:
主页.dart:
List<int> l = [1]; int? result = l.nullable(3); print(result); //--> null print(l.nullable(0)); //--> 1
3条答案
按热度按时间j2qf4p5b1#
错误的最佳实践是不引发错误。
在这种情况下,我会这样做:
不需要
late
,不会引发或捕获错误。如果一个错误被抛出,它可能是程序中的一个 * 真实 * 错误。如果您捕获并忽略了您预期的错误,您可能也捕获了您没有预期的错误,并隐藏了真实的问题。这就是捕获错误作为"正常控制流"的一部分不受欢迎的真正原因。这也是为什么你应该总是从API抛出(并记录)精确的异常类型,这样用户就可以进行精确的捕获。
lyr7nygr2#
希望这个答案能让你满意。:)
nlejzf6q3#
您可以使用extension method:
我的扩展名.dart:
使用它:
主页.dart: