简单的“捕捉”逻辑

时间:2013-06-22 14:07:44

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

我有一个字符串^,它被转换为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);
}

这很好。(FYI capBoxSize-> x是另一个可以评估为uint32的值)。

基本上捕获的是捕捉cbXSizeBox-> Text(这是一个字符串)的值,回到它的默认值,如果用户输入除数字之外的任何内容(例如2g9)。

如果catch块没有捕获格式异常,我想添加代码以将capBoxSize-> x的值更改为它的新有效值。我试图找到对编译器说的内容,"如果你发现了这个异常,就这样做吧。但是如果你没有发现异常,那么就这样做。"是否可以在if else语句中包含catch块?

如果您了解我尝试做的事情,我们将不胜感激。

P.S。在try块中更改capBoxSize-> x的代码并不是我认为的选项。因为这可能会尝试将newX分配为" 2ty" to capBoxSize-> X,这是一个Uint32。这可能会导致错误。

2 个答案:

答案 0 :(得分:5)

不需要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);
  

在try块中更改capBoxSize-> x的代码并不是我认为的选项。因为这可能会尝试将newX分配为" 2ty" to capBoxSize-> X,这是一个Uint32。

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


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

答案 1 :(得分:0)

我想的是:

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.
}