Hi, I've coded a DNS library. When a DNS query fails my library
doesn't raise an exception (as it's expensive) but instead returns a
Symbol (more efficient):
- :dns_error_nxdomain - The domain name does not exist.
- :dns_error_nodata - There is no data of requested type found.
- :dns_error_tempfail - Temporary error, the resolver nameserver was
not able to process our query or timed out.
- :dns_error_protocol - Protocol error, a nameserver returned malformed reply.
An example usage:
···
-----------------------------------------------------------
resolver = EM::Udns::Resolver.new
EM::Udns.run resolver
query = resolver.submit_A "google.com"
query.callback do |result|
puts "result => #{result.inspect}"
end
query.errback do |error|
case error
when :dns_error_nxdomain
# do something
when :dns_error_nodata
# do something
when :dns_error_tempfail
# do something
end
end
--------------------------------------------------------------
So returning a Symbol (in case of failure) is good as I can use it
within a case/when statement.
Another possibility would be returning an instance of a class, something like:
class EM::Udns::ErrorNoDomain < EM::Udns::Error ; end
class EM::Udns::ErrorNoData < EM::Udns::Error ; end
class EM::Udns::ErrorTempFail < EM::Udns::Error ; end
or I could extend Errno module:
class Errno::DnsNoDomain ; end
class Errno::DnsNoData ; end
class Errno::DnsTempail ; end
In your opinnion, which is the most elegant way? any other suggestion?
Thanks a lot.
--
Iñaki Baz Castillo
<ibc@aliax.net>