C#是否该支持“try/catch/else”语法
以前用过一段时间Python,里面有个try/catch/else语法,我觉得挺好用,这个语法形如下:
try:
print('try...')
r = 10 / int('2')
print('result:', r)
except ValueError as e:
print('ValueError:', e)
except ZeroDivisionError as e:
print('ZeroDivisionError:', e)
else:
print('no error!')
finally:
print('finally...')
print('END')
这段代码来至廖雪峰的教程,我觉得这个语法挺好的,我举一个C#的例子:
static void Main(string[] args)
{
int result = 0;
bool hasEx = false;
try
{
result = Div(100, 1);
}
catch (Exception ex)
{
Console.WriteLine("it's wrong:" + ex.Message);
hasEx = true;
}
if (!hasEx)
{
DoSomthing(result);
}
Console.ReadLine();
}
static int Div(int dividend, int divider)
{
return dividend / divider;
}
static void DoSomething(int result)
{
Console.WriteLine("do somthing with " + result);
}
上例中,我想在调用Div方法没有抛出异常的情况下才执行DoSomething方法,一般的处理方法如上面代码所示,用一个bool型变量来判断是否超出了异常,这样写出的代码并不是很优雅。也许有人会说把DoSomething方法放到Div方法的下面,如果Div方法抛出了异常的话就不会执行DoSomething方法了,但是这样做有一个问题:一个try块中放置多个可能抛出异常的方法本身不太合理,一旦catch到异常,可能需要额外的设计才能使得catch中的代码知道异常到底是Div方法抛出的还是DoSomething抛出的。基于如上考虑,我写了一个辅助类:
public static class TryCatchElseHelper
{
public static void Do<TResult>(Func<TResult> tryToDo,
Action<Exception> catchTodo,
Action<TResult> elseTodo)
{
bool catchEx = false;
TResult result = default(TResult);
try
{
if (tryToDo != null)
{
result = tryToDo();
}
}
catch (Exception ex)
{
catchEx = true;
catchTodo?.Invoke(ex);
}
if (!catchEx)
{
elseTodo?.Invoke(result);
}
}
}
调用此类,上面Main函数里的代码可简化如下:
static void Main(string[] args)
{
TryCatchElseHelper.Do<int>(() => Div(100, 0),
ex => Console.WriteLine("it's wrong " + ex.Message),
r => DoSomething(r));
Console.ReadLine();
}
以上代码本属雕虫小技,大家可以借此来讨论讨论微软是否有必要在C#将来的版本中加入try/catch/else的语法,谢谢,祝节日愉快。
C#是否该支持“try/catch/else”语法的更多相关文章
- 【转】让Souce Insight支持多种语言的语法高亮:Python,Ruby,ARM汇编,windows脚本文件(bat/batch),PPC,SQL,TCL,Delphi等
原文网址:http://www.crifan.com/source_insight_support_highlight_for_python_ruby_arm_batch_ppc_sql_tcl_de ...
- C#Framework4.0支持异步async/await语法
由于用户使用的是XP系统,但是程序里异步都是通过async/await代码来实现的,然而async/await需要Framework4.5版本才可以,而XP系统最高只能支持到Framework4.0, ...
- Linux系统里让vim支持markdown格式的语法高亮
Markdown是深受程序员喜爱的一个文件格式. 然而Linux里默认的vim设置,并不支持markdown格式的语法高亮显示. 下面就来介绍如何设置使得markdown格式的文件在vim里也能享有语 ...
- 让VS2010也支持html5和css3语法验证
让VS2010也支持html5和css3语法验证 步骤: 首先打开VS2010或者可自行下载均可,我这里是利用VS的扩展器 弹出如下画面,然后选在,联机库,在右上角输入css3,即可看到下面,然后选中 ...
- Python 为什么不支持 i++ 自增语法,不提供 ++ 操作符?
在 C/C++/Java 等等语言中,整型变量的自增或自减操作是标配,它们又可分为前缀操作(++i 和 --i)与后缀操作(i++ 和 i--),彼此存在着一些细微差别,各有不同的用途. 这些语言的使 ...
- 小程序中支持es7的async语法
小程序中支持es7的async语法 es7的 async 号称是解决回调的最终⽅案 在⼩程序的开发⼯具中,勾选 es6转es5语法 下载 facebook的regenerator库中的 在⼩程序⽬录下 ...
- 总结Cnblogs支持的常用Markdown语法
一.什么是Markdown Markdown是一种可以使用普通文本编辑器编写的标记语言, Markdown的语法简洁明了.学习容易,而且功能比纯文本更强,因此有很多人用它写博客.世界上最流行的博客平台 ...
- Spring AOP支持的AspectJ切入点语法大全
原文出处:http://jinnianshilongnian.iteye.com/blog/1420691 Spring AOP支持的AspectJ切入点指示符 切入点指示符用来指示切入点表达式目的, ...
- WebStorm ES6 语法支持设置和ES6语法的JS文件编译为ES5语法文件
ECMAScript 6是JavaScript语言的下一代标准,已经在2015年6月正式发布了.Mozilla公司将在这个标准的基础上,推出JavaScript 2.0.ES6的目标,是使得JavaS ...
随机推荐
- MBProgressHUD各种样式用法
demo 来源: https://github.com/jdg/MBProgressHUD/ p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px ...
- SQL一次查出相关类容避免长时间占用表(上)
/* server: db: EDI */ -- 以下案例多次查询同一张表,仅有组合条件Name+Direction不同 --可以使用一次查出相关类容避免长时间占用表 USE EDI GO DECLA ...
- SQL AlawaysOn 之一:安装域控制器
一.准备阶段 1. 计算机名称命名 2.IP地址修改.DNS修改 IP地址和DNS不一定要和图上的一致,只要固定就行了 二.安装阶段 1.服务器管理器,仪表盘,点击“添加角色和功能” 2.添加角色和 ...
- [项目记录] 用c语言完成的一个学生成绩管理系统
一.要求: 学生成绩管理系统 某班有最多不超过30人(具体人数由键盘输入)参加期末考试,最多不超过6门(具体门数由键盘输入).使用链表编程实现如下菜单驱动的学生成绩管理系统. 从文件读入每个学生个人信 ...
- 功能总结之MongDB初探
题外话 工作3年,了解的技术颇多,但都是一知半解,了解不是很透澈.用过的技术,就像猴子搬过的包谷,搬一个丢一个.几年风雨,真有点一缕清风过,片叶不沾身的味道. 为强化知识点,提升文档及学习能力,我把以 ...
- python的with语句,超级强大
With语句是什么? 有一些任务,可能事先需要设置,事后做清理工作.对于这种场景,Python的with语句提供了一种非常方便的处理方式.一个很好的例子是文件处理,你需要获取一个文件句柄,从文件中读取 ...
- ajax ----进度条的原理
一.进度条的原理 新知识点:Html5中FormData,xmlHttpRequest中的upload属性,progress事件监控 xmlHttpRequest中的upload属性,实现: < ...
- [.NET] 一步步打造一个简单的 MVC 网站 - BooksStore(一)
一步步打造一个简单的 MVC 网站 - BooksStore(一) 本系列的 GitHub地址:https://github.com/liqingwen2015/Wen.BooksStore 简介 主 ...
- javaWEB与Session
HttpSession(*****)1. HttpSession概述 * HttpSession是由JavaWeb提供的,用来会话跟踪的类.session是服务器端对象,保存在服务器端!!! * ...
- 【转】FLEX中SharedObject介绍及应用
ShareObject介绍: 1 ShareObject,顾名思义共享对象,而通常意义上的共享,从B/S结构上来讲,无非是客户端(浏览器端)的共享和服务器端的共享了,不错,ShareObject刚好份 ...