小编Kee*_*ijk的帖子

异常处理架构

有没有人有异常处理的最佳实践?

在网上搜索时,我在代码级别找到了很多最佳实践(不要抓住一般异常,不要重新抛出新的异常等).我所寻找的是更高级别的最佳实践,例如:

  • 在应用程序中捕获ui级别的异常.
  • 记录尽可能详细的信息,显示友好的错误消息
  • 更像SOA的应用程序区分功能异常(您要求特定客户并希望找到一个,但找不到)和技术异常(数据库脱机)
  • 不要将异常用于功能异常
  • 区分致命和非致命异常
  • 区分使重试成为可能或使重试完全无用的异常
  • 提醒维护人员的模式

非常感谢任何想法和帮助,谢谢.

architecture exception

13
推荐指数
2
解决办法
4886
查看次数

使用空格反序列化带标记的枚举会导致SerializationException

当反序列化用EnumMemberAttribute修饰的带有包含空格的值的标记枚举时,将抛出SerializationException.值中的空格被视为分隔符.

有没有办法更改分隔符或将值放在引号中?或者是否有更简单的解决方案?

我正在考虑的选项是:

  • 用此枚举类型的列表替换带标记的枚举
  • 用下划线替换空格
  • 这是在WCF服务中使用的,我知道某些人在数据交换中的枚举被认为是一件坏事.所以我也在考虑一起丢失枚举.

但我真的觉得这应该是可配置的东西或其他人已经解决的东西.但我找不到任何东西.

我把问题归结为一个简单的单元测试.以下代码导致:

消息=无效的枚举值' Test '无法反序列化为'UnitTests.TestEnum'类型.确保存在必要的枚举值,并且如果类型具有DataContractAttribute属性,则使用EnumMemberAttribute属性标记.来源= System.Runtime.Serialization

using System;
using System.IO;
using System.Runtime.Serialization;
using System.Xml;
using FluentAssertions;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace UnitTests
{
    [TestClass]
    public class EnumSerizalizationTests
    {
        [TestMethod]
        public void SerializingAndDesrializingAFlaggedEnumShouldResultInSameEnumValues()
        {
            //Arrange
            var orgObject = new TestClass { Value = TestEnum.TestValue1 | TestEnum.TestValue2 };
            //Act
            var temp = DataContractSerializeObject(orgObject);
            var newObject = DataContractDeSerializeObject<TestClass>(temp);

            //Assert
            newObject.ShouldBeEquivalentTo(orgObject, "Roundtripping serialization should result in same value");
        }

        public string DataContractSerializeObject<T>(T objectToSerialize)
        {
            using (var output = new StringWriter()) …
Run Code Online (Sandbox Code Playgroud)

c# wcf datacontractserializer

9
推荐指数
1
解决办法
1228
查看次数

需要以相同方式处理的多种方法

在我正在编写的一个C#中,我需要以相同的方式处理具有相同签名的多个方法.此外,将来可能会有更多这些方法.我没有反复重复同样的逻辑,而是想到了以下几点:

private delegate bool cleanStep(BuildData bd, out String strFailure);

List<cleanStep> steps = new List<cleanStep>();
steps.Add(WriteReadme);
steps.Add(DeleteFiles);
steps.Add(TFSHelper.DeleteLabel);
steps.Add(TFSHelper.DeleteBuild);

List<cleanStep>.Enumerator enumerator = steps.GetEnumerator();
bool result = true;
while (result && enumerator.MoveNext())
{
   result = enumerator.Current.Invoke(build, out strFailure);
   if (!result)
   {
      logger.Write(LogTypes.Error, strFailure);
   }
}
Run Code Online (Sandbox Code Playgroud)

我认为这有一些很好的功能,但它也有点过于引擎和混淆.

你能感谢一个更好的方法吗?

BTW:

  • 它不需要是交易的.
  • strFailure不会隐藏在必要时将其完全包装起来的异常

谢谢.

c# delegates

1
推荐指数
1
解决办法
215
查看次数