C++ 简单的;捕捉;思维方式

C++ 简单的;捕捉;思维方式,c++,exception-handling,c++-cli,try-catch,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(capBoxSiz

我有一个字符串^正在转换为以下代码中的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块

如果你理解我的意图,任何建议都将不胜感激


另外,我认为在try块中添加更改capBoxSize->x的代码并不是一个真正的选项。因为这可能会尝试将newX指定为类似于“2ty”的内容,以分配给capBoxSize->X,这是一个Uint32。这可能会导致错误

我认为大致如下:

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

我认为大致如下:

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

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

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

在询问有关c++/cli的问题时,请使用
c++-cli
标记。抱歉,我会更正它。np,我已经在中编辑过了。这只是为了将来。C++和CLI是一种不同于C++的语言,你能更清楚地解释你的文章吗?也许在一个例子中?当询问c++/cli时,请使用
c++-cli
标记。抱歉,我会更正它。np,我已经在中编辑了它。这只是为了将来。C++和CLI是一种不同于C++的语言,你能更清楚地解释你的文章吗?也许在一个例子中?我在想这个,但是为什么OP要求这个呢?我不明白P.S.我不确定,我知道有时候当我太专注于问题时,我会把事情弄得过于复杂。我在想这个,但为什么OP会要求这样做?我不理解P.S.我不确定,我知道有时候我太专注于问题时会把事情弄得过于复杂。这是我想说的,但OP说这不是一个选项,我不理解。@Adrian很简单:OP完全错了。;-)这件事发生在我们所有人身上。这可以解释为什么我不理解它我将试图解释我的错误。我想我所困惑的是(并用这个答案更正了)在运行时抛出异常的那一刻,程序就在那一行“中断”了try块,不再执行try块,跳入catch块。现在我知道了。知道是成功的一半但是,这与Windows的结构化异常处理不同,后者在筛选器返回
异常\u CONTINUE\u EXECUTION
时,有机会在出现问题的语句处正确返回。这是我想说的,但OP说这不是一个选项,我不明白。@Adrian很简单:OP完全错了。;-)这件事发生在我们所有人身上。这可以解释为什么我不理解它我将试图解释我的错误。我想我所困惑的是(并用这个答案更正了)在运行时抛出异常的那一刻,程序就在那一行“中断”了try块,不再执行try块,跳入catch块。现在我知道了。知道是成功的一半但是,这与Windows的结构化异常处理不同,后者在筛选器返回
Exception\u CONTINUE\u EXECUTION
时,有机会在出现问题的语句处返回。