我想知道try..catch
是否可以强制执行进入catch
并在其中运行代码?
此处为示例代码:
try {
if (AnyConditionTrue) {
// run some code
}
else {
// go catch
}
} catch (Exception) {
// run some code here...
}
而不是在else
中引发异常,我建议从catch
中提取代码到方法中,然后从其他方法中调用它
try
{
if (AnyConditionTrue)
{
MethodWhenTrue();
}
else
{
HandleError();
}
}
catch(Exception ex)
{
HandleError();
}
您可以抛出异常强制捕获
if(something == anything)
{
throw new CustomException(" custom text message");
}
您为什么要捕获异常?为什么不只在“ else”块中运行代码?如果必须这样做,则抛出一个新异常
throw new Exception(...);
稍微复活,但我想同时添加一个样本(主要与其他样本相同)和一个用例。
throw new Exception();
在我的情况下,我有自定义控件-少数使用基本Windows.Forms控件的控件,但是添加了两个bool和一个用于跟踪的字符串,并且还自动注册到Singleton 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;
}
,因此它们可以正常运行无需钻取控制容器即可获取(这是选项卡式表格)。
在这种情况下,我正在创建一些方法来通过名称字符串轻松获取值(List<T>
)。对于.Value, .Text, .Checked, .Enabled
,并非所有.Value
对象都具有。如果扩展控件不是Control
类型,则它是ExtendedNumericUpDown
,因为不应针对该控件类型调用该方法。这不是流程,而是无效转换的规定用法。由于InvalidCastException
自然不具有Control
属性,因此Visual Studio不会让我仅强制尝试然后失败。
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...
}
if(conditiontrue)
{
}
else{
throw new Exception();
}
抛出Exception
并同样跳到Catch
的有效方法:
try
{
throw new Exception("Exception Message");
}
catch (Exception e)
{
// after the throw, you will land here
}
是,如果您尝试从尝试中将throw
设置为异常,则将在捕获部分捕获该异常。
我不得不问你为什么要这么做呢?异常处理不能替代控制流。
我认为您想要的是一个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
。当然,您仍然可以像往常一样具有多个alwaysDoThis();
。
正如cadrel所说,但通过Exception来提供更多反馈,这将在innerException中显示:
catch
...
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);
}
//
public class CustomException: Exception
{
public CustomException(string message)
: base(message) { }
}
您可以尝试这个