-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathErrorBucket.cs
134 lines (113 loc) · 3.52 KB
/
ErrorBucket.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
using System;
using System.Collections.Generic;
using System.Text;
namespace SmartMerchant
{
// holds a set of errors that we can build up as work through a process...
public class ErrorBucket
{
private List<string> Errors { get; set; }
// holds a fatal error reference...
public Exception Fatal { get; internal set; }
public ErrorBucket()
{
Errors = new List<string>();
}
// special constructor for fatal exceptions...
private ErrorBucket(Exception ex)
: this()
{
Fatal = ex;
}
// special constructor for cloning another error bucket...
protected ErrorBucket(ErrorBucket donor)
: this()
{
CopyFrom(donor);
}
public void CopyFrom(ErrorBucket donor)
{
// copy the normal errors...
Errors.Clear();
Errors.AddRange(donor.Errors);
// copy the fatal error...
Fatal = donor.Fatal;
}
public void AddError(string error)
{
Errors.Add(error);
}
public void ClearErrors()
{
Errors.Clear();
}
public void Copy(List<string> errorlist)
{
// copy the normal errors...
Errors.Clear();
Errors.AddRange(errorlist);
}
public bool HasErrors
{
get
{
return Errors.Count > 0 || HasFatal;
}
}
public bool HasFatal
{
get
{
return Fatal != null;
}
}
public string GetErrorsAsString()
{
StringBuilder builder = new StringBuilder();
foreach (string error in Errors)
{
if (builder.Length > 0)
builder.Append("\r\n");
builder.Append(error);
}
// fatal?
if (HasFatal)
{
if (builder.Length > 0)
builder.Append("\r\n-------------------------\r\n");
// make this prettier (well, take some of the detail out so it's not so overwhelming.
// ideally you should log this information somewhere...
List<Exception> exes = new List<Exception>();
// if we have an aggregate exception, flatten it, otherwise seed the set...
if (Fatal is AggregateException)
exes.Add(((AggregateException)this.Fatal).Flatten());
else
exes.Add(Fatal);
// walk...
int index = 0;
while (index < exes.Count)
{
if (exes[index].InnerException != null)
exes.Add(exes[index].InnerException);
// add...
if (index > 0)
builder.Append("\r\n");
builder.Append(exes[index].Message);
// next...
index++;
}
}
// return...
return builder.ToString();
}
internal static ErrorBucket CreateFatalBucket(Exception ex)
{
return new ErrorBucket(ex);
}
public void AssertNoErrors()
{
if (HasErrors)
throw new InvalidOperationException(string.Format("Errors have occurred:\r\n{0}", GetErrorsAsString()));
}
}
}