我想知道可以try..catch
强制执行进入catch
并在那里运行代码吗?
这里是示例代码:
try {
if (AnyConditionTrue) {
// run some code
}
else {
// go catch
}
} catch (Exception) {
// run some code here...
}
答案 0 :(得分:27)
我建议不要在else
中抛出异常,而是将catch
中的代码提取到方法中并从其他方法中调用
try
{
if (AnyConditionTrue)
{
MethodWhenTrue();
}
else
{
HandleError();
}
}
catch(Exception ex)
{
HandleError();
}
答案 1 :(得分:22)
try{
if (AnyConditionTrue){
//run some code
}
else{
throw new Exception();
}
}
catch(){
//run some code here...
}
但是就像Yuck所说,我不会推荐这个。你应该退后一步,完成你想要完成的任务。有一种更好的方法(即使用正常的条件流,而不是异常处理)。
答案 2 :(得分:9)
是的,你必须抛出异常:
try
{
throw new Exception("hello");
}
catch (Exception)
{
//run some code here...
}
答案 3 :(得分:2)
function logo_display()
{
?>
<input type="file" name="logo" />
<?php echo get_option('logo'); ?>
<?php
}
function handle_logo_upload()
{
if(!empty($_FILES["demo-file"]["tmp_name"]))
{
$urls = wp_handle_upload($_FILES["logo"], array('test_form' => FALSE));
$temp = $urls["url"];
return $temp;
}
return $option;
}
function display_theme_panel_fields()
{
add_settings_section("section", "All Settings", null, "theme-options");
add_settings_field("logo", "Logo", "logo_display", "theme-options", "section");
register_setting("section", "logo", "handle_logo_upload");
}
add_action("admin_init", "display_theme_panel_fields");
答案 4 :(得分:2)
抛出Exception
并同样跳到Catch
的有效方法:
try
{
throw new Exception("Exception Message");
}
catch (Exception e)
{
// after the throw, you will land here
}
答案 5 :(得分:1)
是的,如果您{1}}尝试throw
之外的异常,它将会在catch部分中被捕获。
我不得不问你为什么要这样做呢?异常处理并不意味着可以替代控制流程。
答案 6 :(得分:1)
我认为你想要的是一个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
。
答案 7 :(得分:1)
正如cadrel所说,但通过异常来提供更多反馈,这将在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);
}
答案 8 :(得分:1)
如果你想“强迫”尝试捕获,只是故意做一些愚蠢的事情,如下:
List<string> cc = null;
foreach (string c in cc) {}
答案 9 :(得分:1)
public class CustomException: Exception
{
public CustomException(string message)
: base(message) { }
}
//
if(something == anything)
{
throw new CustomException(" custom text message");
}
您可以尝试
答案 10 :(得分:0)
您可以抛出异常以强制执行捕获
throw new Exception(...);
答案 11 :(得分:0)
你为什么要捕捉异常?为什么不在“else”块中运行代码?如果必须这样做,只需抛出一个新的异常
throw new Exception();
答案 12 :(得分:0)
稍微复活,但我想添加一个样本(主要与其他样本一样)和一个用例。
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不会让我强制尝试然后失败。