当前位置: 首页 > 面试题库 >

如果我抛出字符串文字,应该捕获哪种类型?

尉迟边浩
2023-03-14
问题内容

我正在Linux下使用g 在C 中编写一个非常简单的应用程序,并且试图将一些原始字符串作为异常抛出(是的,我知道,这不是一个好习惯)。

我有以下代码(简化):

int main()
{
  try
  {
    throw "not implemented";

  }
  catch(std::string &error)
  {
    cerr<<"Error: "<<error<<endl;
  }
  catch(char* error)
  {
    cerr<<"Error: "<<error<<endl;
  }
  catch(...)
  {
    cerr<<"Unknown error"<<endl;
  }
}

然后我进入Unknow error控制台。但是,如果我将文字字符串静态转换为其中一个,std::string或者按预期char *打印Error: not implemented。我的问题是:如果我不想使用静态强制类型转换,我应该捕获哪种类型?


问题答案:

您需要使用char const*而不是char*。任何东西都std::string不会,也char*不会抓住。

关于匹配的类型,捕获具有受限制的规则。规范说(其中“ cv”表示“常量/易失性组合”,或都不表示)。

如果满足以下条件,则处理程序匹配类型为E的异常对象

  • 处理程序的类型为cv T或cv T&,并且E和T是同一类型(忽略顶级cv限定词),或者
  • 处理程序是cv T或cv T&类型,并且T是E的明确公共基类,或者
  • 处理程序的类型为cv1 T * cv2,E是指针类型,可以通过以下任意一个或全部将其转换为处理程序的类型

    • 标准指针转换(4.10),不涉及对指向私有或受保护或模糊类的指针的转换
    • 资格转换

字符串文字的类型为char const[N],但抛出一个数组将使该数组衰减,并实际上抛出一个指向其第一个元素的指针。因此,您不能用a捕获抛出的字符串文字char*,因为在匹配时,它需要将匹配char*到a
char const*,这将丢弃const(仅允许使用条件转换来 添加
const)。char*仅在需要专门转换字符串文字时,才考虑对字符串文字进行特殊转换。



 类似资料:
  • 问题内容: API文档说永远不要捕获 Throwable 子类 错误 ,这表示异常行为。这是否意味着错误和异常之间的隔离是为了告诉程序员应该捕获哪个子类,而不应该捕获哪个子类?还是还有更多呢? 问题答案: 通常,这是严重错误(通常 在平台本身内部 ),您无法想象得到处理。我曾经关心醒目的唯一时间是为了 记录它 ,下面我再重新抛出。 这是非常重要的,因为它很容易让错误(和运行时异常),以这样的方式,

  • 问题内容: 有时,您必须使用列表推导将所有内容转换为字符串,包括字符串本身。 但是我必须要做: 我想知道是否对字符串进行了足够的优化,以至于 不会 创建该字符串的另一个副本。 我试过了: 但这可能是因为Python可以缓存字符串并重用它们。但是,对于任何字符串值,都可以保证该行为吗? 问题答案: 测试对象是否已经是字符串要比总是转换为字符串慢。 那是因为该方法也进行了完全相同的测试(对象已经是字符

  • 问题内容: 我想捕获到字符串的输出。 PHP文档说: 与将结果直接输出到浏览器的任何东西一样,输出控制功能可用于捕获此功能的输出,并将其保存在字符串中(例如)。 这可能如何工作的一个例子是什么? 这是不可能的,因为它不会给我所需的信息。 问题答案: 使用输出缓冲:

  • 问题内容: 该方法中类抛出2 :和,但在我的书上面的代码捕获和。 为什么代码会捕获但没有捕获? 如果在线文档的Formatter类format()方法中甚至没有声明它,我们如何知道是否需要捕获? 问题答案: 文献:是一个 可以由不同类的在Java中像迭代器,枚举,被抛出 扫描仪 或StringTokenizer的。 在你的情况是。它不是从方法。 这 仅仅是在安全方面(如果不给下一个输入,然后抛出此

  • 此时,备份变量仍然包含原始值“hello”(这是因为String的不可变性,对吗?)。 但是用这个方法复制字符串真的安全吗(复制常规的可变对象当然不安全),还是写这个更好呢?: 换句话说,这两个片段有什么区别(如果有的话)? 编辑-第一个代码段是安全的原因: 让我根据已经提供的良好答案(主要集中在两个片段之间的性能差异问题),稍微详细地解释一下: 字符串在Java中是不可变的,这意味着一个字符串对

  • 在catch块中,如果有人输入一个字符串或一个小于13或大于16的数字,我想打印输入有效的卡片no。