![](/img/trans.png)
[英]How can I continue execution of a catch block when the user enters credentials, from an exception caused by a credentials popup appears?
[英]How Can I Force Execution to the Catch Block?
我想知道可以try..catch
强制执行进入catch
并在那里运行代码吗?
这里示例代码:
try {
if (AnyConditionTrue) {
// run some code
}
else {
// go catch
}
} catch (Exception) {
// run some code here...
}
与其在else
抛出异常,我建议您将catch
的代码提取到一个方法中,然后从 else 中调用它
try
{
if (AnyConditionTrue)
{
MethodWhenTrue();
}
else
{
HandleError();
}
}
catch(Exception ex)
{
HandleError();
}
try{
if (AnyConditionTrue){
//run some code
}
else{
throw new Exception();
}
}
catch(){
//run some code here...
}
但就像 Yuck 所说的,我不推荐这个。 您应该退后一步,了解您的设计以及您希望实现的目标。 有一个更好的方法来做到这一点(即使用正常的条件流,而不是异常处理)。
是的,你必须抛出异常:
try
{
throw new Exception("hello");
}
catch (Exception)
{
//run some code here...
}
一种抛出Exception
并跳转到Catch
的有效方法,如下所示:
try
{
throw new Exception("Exception Message");
}
catch (Exception e)
{
// after the throw, you will land here
}
if(conditiontrue)
{
}
else{
throw new Exception();
}
正如cadrel所说,但是通过一个Exception来提供更多的反馈,会在innerException中显示:
try
{
if (AnyConditionTrue)
{
MethodWhenTrue();
}
else
{
HandleError(new Exception("AnyCondition is not true"));
}
}
catch (Exception ex)
{
HandleError(ex);
}
...
private void HandleError(Exception ex) {
throw new ApplicationException("Failure!", ex);
}
如果你想“强迫”尝试捕获,只是故意做一些愚蠢的事情,像这样:
List<string> cc = null;
foreach (string c in cc) {}
public class CustomException: Exception
{
public CustomException(string message)
: base(message) { }
}
//
if(something == anything)
{
throw new CustomException(" custom text message");
}
你可以试试这个
是的,如果您throw
您打算从 try 中catch
的异常,它将在 catch 部分中捕获。
我不得不问你为什么要这样做? 异常处理并不意味着要替代控制流。
我认为你想要的是一个finally
块: http : //msdn.microsoft.com/en-us/library/zwc8s4fz(v=vs.80).aspx
看到这个
try
{
doSomething();
}
catch
{
catchSomething();
throw an error
}
finally
{
alwaysDoThis();
}
如果/当您这样做时,情况会有所不同:
try
{
doSomething();
}
catch
{
catchSomething();
throw an error
}
alwaysDoThis();// will not run on error (in the catch) condition
最后一个实例,如果发生错误,catch 将执行,但不是alwaysDoThis();
. 当然,您仍然可以像往常一样进行多次catch
。
轻微的复活,但我想添加一个样本(主要像其他人一样)和一个用例。
public int GetValueNum(string name)
{
int _ret = 0;
try
{
Control c = (extendedControls.Single(s => s.ValueName == name) as Control);
if (c.GetType() == typeof(ExtendedNumericUpDown))
_ret = (int)((ExtendedNumericUpDown)c).Value;
else
throw new Exception();
}
catch
{
throw new InvalidCastException(String.Format("Invalid cast fetching .Value value for {0}.\nExtendedControllerListener.GetValueNum()", name));
}
return _ret;
}
就我而言,我有自定义控件 - 一些使用基本 Windows.Forms 控件的控件,但添加了两个布尔值和一个用于跟踪的字符串,并且还自动注册到 Singleton List<T>
以便可以正确获取它们无需深入控制容器(它是选项卡形式)。
在这种情况下,我创建了一些方法来通过名称字符串轻松获取值( .Value, .Text, .Checked, .Enabled
)。 在.Value
的情况下,并非所有Control
对象都有它。 如果扩展控件的类型不是ExtendedNumericUpDown
,则它是InvalidCastException
因为不应针对该类型的控件调用该方法。 这不是流,而是无效转换的规定用法。 由于Control
自然没有.Value
属性,Visual Studio 不会让我只是强制尝试并在之后失败。
您可以抛出异常以强制捕获
throw new Exception(...);
你为什么要捕捉异常? 为什么不直接在“else”块中运行代码? 如果你必须这样做,就抛出一个新的异常
throw new Exception();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.