读书人

分享一上小弟我的【返回自定义返回值和

发布时间: 2012-08-29 08:40:14 作者: rapoo

分享一下我的【返回自定义返回值和错误信息】的方法
刚看了个帖子,那个LZ在鄙视用out和ref来返回错误信息。

好吧,其实out和ref我只是在调用一个方法有不少于1个返回值时又不想因此而创建一个类时才使用的。

下面讲下我目前使用的返回错误信息的方法:

在非UI界面的方法中,我会尽量不用catch来捕获异常,除非一些特殊情况,比如这个方法会进行很多个地方的修改,而在修改到其中某一条发现无法修改时需要回滚操作,才会用catch捕获住将修改回滚。但还是会抛出异常!

去年的一个项目中我使用了两种方法。具体原因不详细描述了,直接给大家看代码吧。


1.第一个作为程序内部的错误码返回。 -1 是正确的带有返回值的。可能有人觉得正确的干嘛抛出异常呢?
和项目的特殊性有关,这个软件是提供 lua api 的,lua需要将脚本中返回值传出只能通过这个方法,因为其他的方法已经被我自己做的 lua 虚拟机给拦截住了。在此不多讨论合理性,蛮复杂的。这个只是一个简易的自定义返回异常。

使用方法:只要在最外层代码 catch(CustomReturnCode crc) 就可以了。

C# code
    public class CustomReturnCode : Exception    {        private int _code;        public int Code        {            get { return _code; }        }        private string _message;        public override string Message        {            get            {                return _message;            }        }        public CustomReturnCode()            : base()        {        }        public CustomReturnCode(string message)            : base(message)        {            _code = -1;            _message = message;        }        public CustomReturnCode(int code, string message)        {            _code = code;            _message = message;        }        public void SetReturnCode(int code, string message)        {            _code = code;            _message = message;        }    }



2.同第一个一样我不详细讲为什么这么做了,只是提供另一个思路。
这个返回信息其实不是抛出异常,而是接受方,或者说你的调用函数自己判断是否为异常的。

使用方法:

CommandResult cr = CommandResult.Success;

//获得描述
EnumHelper.GetEnumDescription(cr);
//获得枚举int值
(int)cr;

C# code
    //返回执行结果的枚举    public enum CommandResult    {        [Description("成功")]        Success = 1,        [Description("Url太长")]        UrlTooLong = 2,    };    //枚举功能辅助    public static class EnumHelper    {        public static string GetEnumDescription(object enumSubitem)        {            enumSubitem = (Enum)enumSubitem;            string strValue = enumSubitem.ToString();            FieldInfo fieldinfo = enumSubitem.GetType().GetField(strValue);            if (fieldinfo != null)            {                Object[] objs = fieldinfo.GetCustomAttributes(typeof(DescriptionAttribute), false);                if (objs == null || objs.Length == 0)                {                    return strValue;                }                else                {                    DescriptionAttribute da = (DescriptionAttribute)objs[0];                    return da.Description;                }            }            else            {                return "";            }        }    }


[解决办法]
支持分享
[解决办法]
支持新思路
[解决办法]
楼主的例子很特殊,一般情况下,尽量避免用异常来返回正确信息,因为异常开销比较大。

第2个方法无非是返回一个用户自定义的对象。给枚举加个description属性当然并非不可,但感觉意义不大,本来,Success, UrlTooLong的意思已经够清楚了。

至于楼主说:
“在非UI界面的方法中,我会尽量不用catch来捕获异常,除非一些特殊情况,比如这个方法会进行很多个地方的修改,而在修改到其中某一条发现无法修改时需要回滚操作,才会用catch捕获住将修改回滚。但还是会抛出异常!


不很理解。不捕获异常,如何打log?如果没有log,出了问题如何排错?

读书人网 >C#

热点推荐