【问题标题】:Simple "catching" logic简单的“捕捉”逻辑
【发布时间】:2013-06-22 14:07:44
【问题描述】:

我有一个正在转换为 Uint32 的字符串^ 在下面的代码中:

try
{
    int newX = System::Convert::ToUInt32(this->cbXSizeBox->Text);
}
catch (FormatException^ e)
{
    printf("\nNot a valid 3-digit number");
    this->cbXSizeBox->Text = System::Convert::ToString(capBoxSize->x);
}

这很好用。(仅供参考 capBoxSize->x 是另一个可以评估为 uint32 的值)。

基本上,如果用户输入除数字以外的任何内容(例如 2g9),则捕获 cbXSizeBox->Text(它是一个字符串)的值,使其恢复为默认值。

如果 catch 块没有捕获格式异常,我想添加代码以将 capBoxSize->x 的值更改为新的有效值。我试图找到对编译器说的东西,“如果你捕捉到这个异常,就这样做。但如果你没有捕捉到异常,就这样做。”是否可以在 if else 语句中包装 catch 块?

如果您了解我想要做什么,任何建议都将不胜感激。

附:我认为将代码更改 capBoxSize->x 放在 try 块中并不是一个真正的选择。因为这可能会尝试将 newX 作为“2ty”分配给 capBoxSize->X,它是一个 Uint32。这可能会导致错误。

【问题讨论】:

  • 在询问 C++/CLI 时请使用c++-cli 标签。
  • 抱歉,我会改正的。
  • np,我已经编辑了它。它只是为了未来。 C++/CLI 是与 C++ 不同的语言。
  • 你能解释一下你的 p.s.更清楚。举个例子吧?

标签: c++ exception-handling c++-cli try-catch


【解决方案1】:

不需要else 块,只需将格式放在实际解析之后:

try {
    int newX = System::Convert::ToUInt32(this->cbXSizeBox->Text);
    capBoxSize->x = newX;
}
catch (FormatException^ e) {
    printf("\nNot a valid 3-digit number");
    this->cbXSizeBox->Text = System::Convert::ToString(capBoxSize->x);
}

其实不需要临时的newX,直接赋值即可:

capBoxSize->x = System::Convert::ToUInt32(this->cbXSizeBox->Text);

我认为将代码更改 capBoxSize->x 放在 try 块中并不是一个真正的选择。因为这可能会尝试将 newX 作为“2ty”分配给 capBoxSize->X,它是一个 Uint32。

这永远不会发生,因为此时您的代码已经抛出异常,因此离开了try 块并进入了catch 块。


也就是说,我会在这里避免使用try…catch,而是使用System::Int32::TryParse

【讨论】:

  • 这就是我要说的,但 OP 说这不是一个选项,我不明白。
  • @Adrian 很简单:OP 完全是错误的。 ;-) 它发生在我们所有人身上。
  • 这可以解释为什么我不明白。 :) :D
  • 我会尝试解释我的错误。我认为我感到困惑(并用这个答案更正了)是,在运行时抛出异常的那一刻,程序在该行“突破”了 try 块,而不再执行任何 try 块,跳入 catch 块。现在我知道了。知道是成功的一半! :D
  • 是的,这与 Windows 的结构化异常处理不同,如果过滤器返回 EXCEPTION_CONTINUE_EXECUTION,则有机会在违规语句处返回。
【解决方案2】:

我认为是这样的:

bool exception_caught = false;
try {
    int newX = System::Convert::ToUInt32(this->cbXSizeBox->Text);
} catch (FormatException ^e) {
    //  Format exception code.
    exception_caught = true;
    // Handle Exception stuff
}

if (!exception_caught) {
    //  Other stuff.
}

【讨论】:

  • 我在想这个,但为什么 OP 要求这个?我不明白 P.S.
  • 我不确定,我知道有时当我过于专注于问题时,我会把事情弄得过于复杂。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-02
  • 2018-04-10
  • 2012-02-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多