Skip to content
This repository was archived by the owner on Jul 19, 2025. It is now read-only.

Commit b4bb9b2

Browse files
author
Jon Yurek
committed
Display the error message when we have one
Both Asana and Github provide a nicer error message when something goes wrong. If we get that response body, use it by supplying it as a supplementary error message. If we have this message, prefer it to the "real" exception's message. We must still send the message we log, so that it's saved along with the event's data.
1 parent 3e054c0 commit b4bb9b2

File tree

6 files changed

+45
-13
lines changed

6 files changed

+45
-13
lines changed

lib/cc/service/invocation/with_error_handling.rb

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,15 @@ def call
1515
params: e.params,
1616
status: e.status,
1717
endpoint_url: e.endpoint_url,
18-
message: error_message(e)
18+
message: e.user_message || e.message,
19+
log_message: error_message(e)
1920
}
2021
rescue => e
2122
@logger.error(error_message(e))
2223
{
2324
ok: false,
24-
message: error_message(e)
25+
message: e.message,
26+
log_message: error_message(e)
2527
}
2628
end
2729

lib/cc/service/response_check.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
class CC::Service
22
class HTTPError < StandardError
33
attr_reader :response_body, :status, :params, :endpoint_url
4+
attr_accessor :user_message
45

56
def initialize(message, env)
67
@response_body = env[:body]

lib/cc/services/asana.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ def receive_test
2525
result.merge(
2626
message: "Ticket <a href='#{result[:url]}'>#{result[:id]}</a> created."
2727
)
28+
rescue CC::Service::HTTPError => ex
29+
body = JSON.parse(ex.response_body)
30+
ex.user_message = body["errors"].map{|e| e["message"] }.join(" ")
31+
raise ex
2832
end
2933

3034

lib/cc/services/github_issues.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ def receive_test
2424
result.merge(
2525
message: "Issue <a href='#{result[:url]}'>##{result[:number]}</a> created."
2626
)
27+
rescue CC::Service::HTTPError => e
28+
body = JSON.parse(e.response_body)
29+
e.user_message = body["message"]
30+
raise e
2731
end
2832

2933
def receive_quality

test/invocation_error_handling_test.rb

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ def test_http_errors_return_relevant_data
3030
assert_equal 401, result[:status]
3131
assert_equal "params", result[:params]
3232
assert_equal "url", result[:endpoint_url]
33-
assert_equal "Exception invoking service: [prefix] (CC::Service::HTTPError) foo. Response: <nil>", result[:message]
33+
assert_equal "foo", result[:message]
34+
assert_equal "Exception invoking service: [prefix] (CC::Service::HTTPError) foo. Response: <nil>", result[:log_message]
3435
end
3536

3637
def test_error_returns_a_hash_with_explanations
@@ -44,6 +45,7 @@ def test_error_returns_a_hash_with_explanations
4445

4546
result = handler.call
4647
assert_equal false, result[:ok]
47-
assert_equal "Exception invoking service: [prefix] (ArgumentError) lol", result[:message]
48+
assert_equal "lol", result[:message]
49+
assert_equal "Exception invoking service: [prefix] (ArgumentError) lol", result[:log_message]
4850
end
4951
end

test/invocation_test.rb

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ def test_success
1212

1313
def test_retries
1414
service = FakeService.new
15-
service.raise_on_receive = true
15+
service.fake_error = RuntimeError.new
1616
error_occurred = false
1717

1818
begin
@@ -41,7 +41,7 @@ def test_metrics
4141
def test_metrics_on_errors
4242
statsd = FakeStatsd.new
4343
service = FakeService.new
44-
service.raise_on_receive = true
44+
service.fake_error = RuntimeError.new
4545
error_occurred = false
4646

4747
begin
@@ -57,31 +57,45 @@ def test_metrics_on_errors
5757
assert_match /^services\.errors\.a_prefix/, statsd.incremented_keys.first
5858
end
5959

60+
def test_user_message
61+
service = FakeService.new
62+
service.fake_error = CC::Service::HTTPError.new("Boom", {})
63+
service.override_user_message = "Hey do this"
64+
logger = FakeLogger.new
65+
66+
result = CC::Service::Invocation.invoke(service) do |i|
67+
i.with :error_handling, logger, "a_prefix"
68+
end
69+
70+
assert_equal "Hey do this", result[:message]
71+
assert_match /Boom/, result[:log_message]
72+
end
73+
6074
def test_error_handling
6175
service = FakeService.new
62-
service.raise_on_receive = true
76+
service.fake_error = RuntimeError.new("Boom")
6377
logger = FakeLogger.new
6478

6579
result = CC::Service::Invocation.invoke(service) do |i|
6680
i.with :error_handling, logger, "a_prefix"
6781
end
6882

69-
assert_equal({ok: false, message: "Exception invoking service: [a_prefix] (RuntimeError) Boom"}, result)
83+
assert_equal({ok: false, message: "Boom", log_message: "Exception invoking service: [a_prefix] (RuntimeError) Boom"}, result)
7084
assert_equal 1, logger.logged_errors.length
7185
assert_match /^Exception invoking service: \[a_prefix\]/, logger.logged_errors.first
7286
end
7387

7488
def test_multiple_middleware
7589
service = FakeService.new
76-
service.raise_on_receive = true
90+
service.fake_error = RuntimeError.new("Boom")
7791
logger = FakeLogger.new
7892

7993
result = CC::Service::Invocation.invoke(service) do |i|
8094
i.with :retries, 3
8195
i.with :error_handling, logger
8296
end
8397

84-
assert_equal({ok: false, message: "Exception invoking service: (RuntimeError) Boom"}, result)
98+
assert_equal({ok: false, message: "Boom", log_message: "Exception invoking service: (RuntimeError) Boom"}, result)
8599
assert_equal 1 + 3, service.receive_count
86100
assert_equal 1, logger.logged_errors.length
87101
end
@@ -90,7 +104,7 @@ def test_multiple_middleware
90104

91105
class FakeService
92106
attr_reader :receive_count
93-
attr_accessor :raise_on_receive
107+
attr_accessor :fake_error, :override_user_message
94108

95109
def initialize(result = nil)
96110
@result = result
@@ -100,8 +114,13 @@ def initialize(result = nil)
100114
def receive
101115
@receive_count += 1
102116

103-
if @raise_on_receive
104-
raise "Boom"
117+
begin
118+
raise @fake_error if @fake_error
119+
rescue => e
120+
if override_user_message
121+
e.user_message = override_user_message
122+
end
123+
raise e
105124
end
106125

107126
@result

0 commit comments

Comments
 (0)