多年来,我一直无法得到以下问题的正确答案:为什么一些开发人员如此反对已检查的异常?我有很多对话,在博客上阅读,阅读Bruce Eckel所说的内容(我看到的第一个人反对他们).
我目前正在编写一些新代码,并非常注意我如何处理异常.我试图看到"我们不喜欢被检查的例外"人群的观点,我仍然看不到它.
每次谈话结束时,同样的问题都没有得到答复......让我把它设置起来:
一般来说(从Java的设计方式来看),
我听到的一个常见论点是,如果发生异常,那么开发人员将要做的就是退出该程序.
我听到的另一个常见论点是,经过检查的异常会使重构代码变得更加困难.
对于"我将要做的就是退出"这个论点,我说即使你要退出,你也需要显示一个合理的错误信息.如果您只是在处理错误,那么当程序退出而没有明确说明原因时,您的用户将不会过于高兴.
对于"它很难重构"的人群,这表明没有选择适当的抽象级别.而不是声明方法抛出IOException,IOException应该转换为更适合正在发生的事件的异常.
我没有使用catch(Exception)包装Main的问题(或者在某些情况下catch(Throwable)以确保程序可以正常退出 - 但我总是捕获我需要的特定异常.这样做允许我,至少,显示适当的错误消息.
人们从不回复的问题是:
如果你抛出RuntimeException子类而不是Exception子类,那么你怎么知道你应该捕获什么?
如果答案是捕获异常,那么您也会以与系统异常相同的方式处理程序员错误.这对我来说似乎不对.
如果您捕获Throwable,那么您将以相同的方式处理系统异常和VM错误(等).这对我来说似乎不对.
如果答案是你只捕获你知道的异常,那么你怎么知道抛出的是什么?当程序员X抛出一个新的异常并忘记捕获它时会发生什么?这对我来说似乎非常危险.
我会说显示堆栈跟踪的程序是错误的.那些不喜欢检查异常的人是不是觉得那样?
那么,如果您不喜欢已检查的异常,您可以解释为什么不能并且回答那些无法解答的问题吗?
编辑:我不是在寻找何时使用任何一个模型的建议,我正在寻找的是为什么人们从RuntimeException扩展,因为他们不喜欢从Exception扩展和/或为什么他们捕获异常然后重新抛出RuntimeException而不是将抛出添加到他们的方法中.我想了解不喜欢检查异常的动机.
从 Telegram 的 Bot API 版本 4.5 开始,该 API 支持新的文本格式MarkdownV2. 这是之前 Markdown 支持的增强版本。
- 在内
(...)联链接定义的内部,所有 ')' 和 '\' 必须使用前面的 '\' 字符进行转义。- 在所有其他位置,字符 '_'、'*'、'['、']'、'('、')'、'~'、'`'、'>'、'#'、'+'、' -'、'='、'|'、'{'、'}'、'.'、'!' 必须使用前面的字符“\”进行转义。
为什么点字符.需要转义?据我所知,它没有在任何格式化语法中使用。Telegram 提供的语法示例当然不会.以这种方式使用:
要使用此模式,请在parse_mode字段中传递MarkdownV2。在消息中使用以下语法:
Run Code Online (Sandbox Code Playgroud)*bold \*text* _italic \*text_ __underline__ ~strikethrough~ *bold _italic bold ~italic bold strikethrough~ __underline italic bold___ bold* [inline URL](http://www.example.com/) [inline mention of a user](tg://user?id=123456789) `inline fixed-width code` ``` pre-formatted fixed-width code block ``` ```python pre-formatted fixed-width code block written in …
更新:我已经启动了一个关于 python-ideas的线程来为此目的提出额外的语法或 stdlib 函数(即指定由 发送的第一个值yield from)。到目前为止 0 回复...:/
如何拦截子生成器的第一个生成值,但使用 将迭代的其余部分委托给后者yield from?
例如,假设我们有一个任意的双向生成器subgen,我们想将它包装在另一个生成器中gen。的目的gen是拦截第一个subgen生成的值,并将生成的其余部分(包括发送的值、抛出的异常、.close() 等)委托给子生成器。
可能会想到的第一件事可能是这样的:
def gen():
g = subgen()
first = next(g)
# do something with first...
yield "intercepted"
# delegate the rest
yield from g
Run Code Online (Sandbox Code Playgroud)
但这是错误的,因为当调用者.send在获得第一个值后将某些东西返回给生成器时,它最终会作为yield "intercepted"表达式的值被忽略,而是作为第一个值g接收,作为语义的一部分的。None.sendyield from
所以我们可能会想这样做:
def gen():
g = subgen()
first = next(g)
# do …Run Code Online (Sandbox Code Playgroud) 是否有相同的版本std::find(first, last)但是std::map?即,是否有一个版本std::map的find方法可以搜索a中的元素map,但是只将搜索限制在指定的[first, last)范围内?理想情况下,解决方案应该是对数的大小[first, last).
从我所看到的,std::map::find它本身不支持这个功能(它总是搜索整个地图).
我有一个装饰器,它接受一个函数并返回具有一些附加属性的相同函数:
import functools
from typing import *
def decorator(func: Callable) -> Callable:
func.attr1 = "spam"
func.attr2 = "eggs"
return func
Run Code Online (Sandbox Code Playgroud)
如何键入提示的返回值decorator?我希望类型提示传达两条信息:
Callableattr1和attr2如果我写一个协议,
class CallableWithAttrs(Protocol):
attr1: str
attr2: str
Run Code Online (Sandbox Code Playgroud)
那我输了Callable。显然我不能让协议继承自Callable;
class CallableWithAttrs(Callable, Protocol):
attr1: str
attr2: str
Run Code Online (Sandbox Code Playgroud)
mypy 说:
error: Invalid base class "Callable"
Run Code Online (Sandbox Code Playgroud)
另一方面,如果我只使用Callable,我会丢失有关添加属性的信息。
这在引入类型变量时可能更加复杂,即当装饰器必须返回与给定函数相同类型的可调用对象时func,正如 MisterMiyagi 在评论中指出的那样。
import functools
from typing import *
C = TypeVar('C', bound=Callable)
def decorator(func: C) -> C:
func.attr1 = …Run Code Online (Sandbox Code Playgroud) Python Language Reference 规定object.__await__如下:
object.__await__(self)必须返回一个迭代器。应该用于实现可等待的对象。例如,
asyncio.Future实现此方法以与 await 表达式兼容。
就是这样。我觉得这个规范很模糊,也不是很具体(讽刺的是)。好的,它应该返回一个迭代器,但它可以是一个任意的迭代器吗?显然不是:
import asyncio
class Spam:
def __await__(self):
yield from range(10)
async def main():
await Spam()
asyncio.run(main())
Run Code Online (Sandbox Code Playgroud)
RuntimeError: Task got bad yield: 0
Run Code Online (Sandbox Code Playgroud)
我假设asyncio事件循环期望迭代器产生特定类型的对象。那么它究竟应该产生什么?(为什么没有记录在案?)
编辑:据我所知,这在任何地方都没有记录。但我一直在调查我自己,我觉得关键是了解哪些对象asyncio预计其协同程序产生在于task_step_impl中_asynciomodule.c。
更新:我做了一个PR与此澄清的目的CPython的库:“明确的模糊规范object.__await__”。目前正在审核中。
我正在尝试在开发时通过 Expo 应用程序让 Firebase - Firestore 数据库模拟器在我的物理 IOS 设备上运行。
我可以让 Localhost 在浏览器中工作,并让 10.0.2.2:(8080) 通过 Android 模拟器工作。但是,我无法让我的物理 IOS 设备正常工作。我收到 firebase 无法在 10 秒内连接的错误。
尝试了 localhost,尝试了 expo 应用程序 192.168.xx 中提供的 IP,尝试了我当前 wifi 位置中给出的 IP 地址,什么也没有。
我正在使用这段代码来连接 Android 模拟器/Web 浏览器
firebase.firestore().settings({
experimentalForceLongPolling: true,
host: '10.0.2.2:8084',
ssl: false})
Run Code Online (Sandbox Code Playgroud) 我有一个使用 Firebase 作为后端的 Flutter 应用程序。我使用 Firebase 模拟器在调试模式下测试我的应用程序。
为了允许物理设备连接到我在开发计算机上运行的模拟器,我更改了配置,以便模拟器在我的本地网络上使用该计算机的本地 IP 运行。(我通过 Dart 环境变量指定此 IP。)
firebase.json
{
// ...
"emulators": {
"auth": {
"host": "0.0.0.0", // this is to avoid having to hard-code my local IP, which might change
"port": 9099
},
"firestore": {
"host": "0.0.0.0",
"port": 8080
},
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
main.dart
if (kDebugMode) {
const emulatorHost =
String.fromEnvironment("EMULATOR_HOST", defaultValue: "localhost");
FirebaseAuth.instance.useAuthEmulator(emulatorHost, 9099);
FirebaseFirestore.instance.useFirestoreEmulator(emulatorHost, 8080);
}
Run Code Online (Sandbox Code Playgroud)
为了在我的应用程序上测试 Web 版本,我启动模拟器并通过 Android Studio 运行 Web 应用程序,所有这些都在同一个应用程序上进行。该应用程序能够与 Auth 模拟器进行通信,没有问题。
但是,当我在物理 Android 设备或 Android …
我有接受std::vector迭代器的函数,例如
typedef std::vector<Point> Points;
Points ConvexHull(Points::const_iterator first, Points::const_iterator last);
Run Code Online (Sandbox Code Playgroud)
我通常将std迭代器传递给他们,但有时我需要使用boost迭代器,例如boost::join的范围迭代器。我应该如何更改函数的参数化(理想情况下没有模板),以使它们接受两个迭代器?此外,如何在每种类型中指示所需的迭代器概念?
我尝试查看boost::range文档,但是这对我来说是非常混乱的,而且我不知道从哪里开始。
例如,我找不到之间的区别boost::range_details::any_forward_iterator_interface和boost::range_details::any_forward_iterator_wrapper,以及是否我应该要么使用那些指定我需要一个前向迭代。
编辑:
如果使用boost::any_range,如何传递非常量左值引用?
例如:
template<typename T>
using Range = boost::any_range<T, boost::random_access_traversal_tag,
T, std::ptrdiff_t>;
f(Range<Point> &points); // defined elsewhere
// -------------
vector<Point> vec;
f(vec); // error; cannot bind non-const lvalue reference to unrelated type
Run Code Online (Sandbox Code Playgroud) numpy允许通过适当地使用来处理源自浮点的IEEE-754 异常np.seterr。但是seterr仅支持以下关键字,每个关键字都对应于 IEEE-754 例外:
divide – 除以零的处理。under – 处理浮点溢出。over – 处理浮点溢出。invalid – 无效浮点运算的处理。但是,“不精确”的 IEEE-754 例外没有关键字。如何在 Python 中处理它?
python ×4
c++ ×2
firebase ×2
algorithm ×1
android ×1
async-await ×1
boost ×1
boost-range ×1
emulation ×1
escaping ×1
exception ×1
expo ×1
generator ×1
ieee-754 ×1
ios ×1
iterator ×1
java ×1
markdown ×1
numpy ×1
search ×1
std ×1
stdmap ×1
telegram ×1
telegram-bot ×1
type-hinting ×1
yield-from ×1