小编Ana*_*and的帖子

针对已检查异常的案例

多年来,我一直无法得到以下问题的正确答案:为什么一些开发人员如此反对已检查的异常?我有很多对话,在博客上阅读,阅读Bruce Eckel所说的内容(我看到的第一个人反对他们).

我目前正在编写一些新代码,并非常注意我如何处理异常.我试图看到"我们不喜欢被检查的例外"人群的观点,我仍然看不到它.

每次谈话结束时,同样的问题都没有得到答复......让我把它设置起来:

一般来说(从Java的设计方式来看),

  • 对于永远不应该捕获的东西是错误的(VM有花生过敏而且有人丢了一罐花生)
  • RuntimeException用于程序员做错的事情(程序员走出数组的末尾)
  • 异常(RuntimeException除外)适用于程序员无法控制的内容(在写入文件系统时磁盘已填满,已达到进程的文件句柄限制,您无法再打开任何文件)
  • Throwable只是所有异常类型的父级.

我听到的一个常见论点是,如果发生异常,那么开发人员将要做的就是退出该程序.

我听到的另一个常见论点是,经过检查的异常会使重构代码变得更加困难.

对于"我将要做的就是退出"这个论点,我说即使你要退出,你也需要显示一个合理的错误信息.如果您只是在处理错误,那么当程序退出而没有明确说明原因时,您的用户将不会过于高兴.

对于"它很难重构"的人群,这表明没有选择适当的抽象级别.而不是声明方法抛出IOException,IOException应该转换为更适合正在发生的事件的异常.

我没有使用catch(Exception)包装Main的问题(或者在某些情况下catch(Throwable)以确保程序可以正常退出 - 但我总是捕获我需要的特定异常.这样做允许我,至少,显示适当的错误消息.

人们从不回复的问题是:

如果你抛出RuntimeException子类而不是Exception子类,那么你怎么知道你应该捕获什么?

如果答案是捕获异常,那么您也会以与系统异常相同的方式处理程序员错误.这对我来说似乎不对.

如果您捕获Throwable,那么您将以相同的方式处理系统异常和VM错误(等).这对我来说似乎不对.

如果答案是你只捕获你知道的异常,那么你怎么知道抛出的是什么?当程序员X抛出一个新的异常并忘记捕获它时会发生什么?这对我来说似乎非常危险.

我会说显示堆栈跟踪的程序是错误的.那些不喜欢检查异常的人是不是觉得那样?

那么,如果您不喜欢已检查的异常,您可以解释为什么不能并且回答那些无法解答的问题吗?

编辑:我不是在寻找何时使用任何一个模型的建议,我正在寻找的是为什么人们从RuntimeException扩展,因为他们不喜欢从Exception扩展和/或为什么他们捕获异常然后重新抛出RuntimeException而不是将抛出添加到他们的方法中.我想了解不喜欢检查异常的动机.

java exception checked-exceptions

437
推荐指数
21
解决办法
5万
查看次数

为什么是 '。' Telegram 的 Bot API 中 MarkdownV2 中的保留字符?

从 Telegram 的 Bot API 版本 4.5 开始,该 API 支持新的文本格式MarkdownV2. 这是之前 Markdown 支持的增强版本。

MarkdownV2 的“规范”说:

  • 在内(...)联链接定义的内部,所有 ')' 和 '\' 必须使用前面的 '\' 字符进行转义。
  • 在所有其他位置,字符 '_'、'*'、'['、']'、'('、')'、'~'、'`'、'>'、'#'、'+'、' -'、'='、'|'、'{'、'}'、'.'、'!' 必须使用前面的字符“\”进行转义。

为什么点字符.需要转义?据我所知,它没有在任何格式化语法中使用。Telegram 提供的语法示例当然不会.以这种方式使用:

要使用此模式,请在parse_mode字段中传递MarkdownV2。在消息中使用以下语法:

*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 …
Run Code Online (Sandbox Code Playgroud)

markdown escaping telegram telegram-bot

15
推荐指数
1
解决办法
1万
查看次数

如何截取生成器的第一个值并透明地从其余值中产生

更新:我已经启动了一个关于 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)

python generator yield-from

12
推荐指数
1
解决办法
363
查看次数

如何在std :: map中找到指定范围内的元素?

是否有相同的版本std::find(first, last)但是std::map?即,是否有一个版本std::mapfind方法可以搜索a中的元素map,但是只将搜索限制在指定的[first, last)范围内?理想情况下,解决方案应该是对数的大小[first, last).

我所看到的,std::map::find它本身不支持这个功能(它总是搜索整个地图).

c++ algorithm search stdmap

11
推荐指数
1
解决办法
208
查看次数

如何将自定义协议与 Callable 协议结合起来?

我有一个装饰器,它接受一个函数并返回具有一些附加属性的相同函数:

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?我希望类型提示传达两条信息:

  1. 返回值是一个 Callable
  2. 返回值具有属性attr1attr2

如果我写一个协议,

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 type-hinting python-typing

11
推荐指数
2
解决办法
811
查看次数

__await__ 的精确规范

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__。目前正在审核中。

python async-await python-asyncio

9
推荐指数
1
解决办法
612
查看次数

物理 IOS/Android 设备上的 Firebase Firestore 模拟器

我正在尝试在开发时通过 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)

emulation ios firebase expo google-cloud-firestore

9
推荐指数
1
解决办法
4060
查看次数

将 Android 应用连接到 Firebase Auth 模拟器,但不允许明文 HTTP 流量

我有一个使用 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 …

android firebase firebase-tools firebase-authentication

7
推荐指数
0
解决办法
830
查看次数

如何在标准迭代器中使用`boost :: range`迭代器

我有接受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_interfaceboost::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)

c++ boost iterator std boost-range

5
推荐指数
1
解决办法
291
查看次数

Python/numpy:捕获 IEEE-754“不精确”异常

numpy允许通过适当地使用来处理源自浮点的IEEE-754 异常np.seterr。但是seterr仅支持以下关键字,每个关键字都对应于 IEEE-754 例外:

  • divide – 除以零的处理。
  • under – 处理浮点溢出。
  • over – 处理浮点溢出。
  • invalid – 无效浮点运算的处理。

但是,“不精确”的 IEEE-754 例外没有关键字。如何在 Python 中处理它?

python numpy floating-point-exceptions ieee-754

5
推荐指数
1
解决办法
72
查看次数