Wednesday, April 14, 2010

System error support in C++0x - part 5

[ part 1, part 2, part 3, part 4 ]

Creating your own error conditions

User-extensibility in the <system_error> facility is not limited to error codes: error_condition permits the same customisation.

Why create custom error conditions?

To answer this question, let's revisit the distinction between error_code and error_condition:

  • class error_code - represents a specific error value returned by an operation (such as a system call).
  • class error_condition - something that you want to test for and, potentially, react to in your code.

This suggests some use cases for custom error conditions:

  • Abstraction of OS-specific errors.

    Let's say you're writing a portable wrapper around getaddrinfo(). Two interesting error conditions are the tentative "the name does not resolve at this time, try again later", and the authoritative "the name does not resolve". The getaddrinfo() function reports these errors as follows:

    • On POSIX platforms, the errors are EAI_AGAIN and EAI_NONAME, respectively. The error values are in a distinct "namespace" to errno values. This means you will have to implement a new error_category to capture the errors.
    • On Windows, the errors are WSAEAI_AGAIN and WSAEAI_NONAME. Although the names are similar to the POSIX errors, they share the GetLastError "namespace". Consequently, you may want to reuse std::system_category() to capture and represent getaddrinfo() errors on this platform.

    To avoid discarding information, you want to preserve the original OS-specific error code while providing two error conditions (called name_not_found_try_again and name_not_found, say) that API users can test against.

  • Giving context-specific meaning to generic error codes.

    Most POSIX system calls use errno to report errors. Rather than define new errors for each function, the same errors are reused and you may have to look at the corresponding man page to determine the meaning. If you implement your own abstractions on top of these system calls, this context is lost to the user.

    For example, say you want to implement a simple database where each entry is stored in a separate flat file. When you try to read an entry, the database calls open() to access the file. This function sets errno to ENOENT if the file does not exist.

    As the database's storage mechanism is abstracted from the user, it could be surprising to ask them to test for no_such_file_or_directory. Instead, you can create your own context-specific error condition, no_such_entry, which is equivalent to ENOENT.

  • Testing for a set of related errors.

    As your codebase grows, you might find the same set of errors are checked again and again. Perhaps you need to respond to low system resources:

    • not_enough_memory
    • resource_unavailable_try_again
    • too_many_files_open
    • too_many_files_open_in_system
    • ...

    in several places, but the subsequent action differs at each point of use. This shows that there is a more general condition, "the system resources are low", that you want to test for and react to in your code.

    A custom error condition, low_system_resources, can be defined so that its equivalence is based on a combination of other error conditions. This allows you to write each test as:

    if (ec == low_system_resources)
    ...

    and so eliminate the repetition of individual tests.

The definition of custom error conditions is similar to the method for error_codes, as you will see in the steps below.

Step 1: define the error values

You need to create an enum for the error values, similar to std::errc:

enum class api_error
{
low_system_resources = 1,
...
name_not_found,
...
no_such_entry
};

The actual values you use are not important, but you must ensure that they are distinct and non-zero.

Step 2: define an error_category class

An error_condition object consists of both an error value and a category. To create a new category, you must derive a class from error_category:

class api_category_impl
: public std::error_category
{
public:
virtual const char* name() const;
virtual std::string message(int ev) const;
virtual bool equivalent(
const std::error_code& code,
int condition) const;
};

Step 3: give the category a human-readable name

The error_category::name() virtual function must return a string identifying the category:

const char* api_category_impl::name() const
{
return "api";
}

Step 4: convert error conditions to strings

The error_category::message() function converts an error value into a string that describes the error:

std::string api_category_impl::message(int ev) const
{
switch (ev)
{
case api_error::low_system_resources:
return "Low system resources";
...
}
}

However, depending on your use case, it may be unlikely that you'll ever call error_condition::message(). In that case, you can take a shortcut and simply write:

std::string api_category_impl::message(int ev) const
{
return "api error";
}

Step 5: implement error equivalence

The error_category::equivalent() virtual function is used to define equivalence between error codes and conditions. In fact, there are two overloads of the error_category::equivalent() function. The first:

virtual bool equivalent(int code,
const error_condition& condition) const;

is used to establish equivalence between error_codes in the current category with arbitrary error_conditions. The second overload:

virtual bool equivalent(
const error_code& code,
int condition) const;

defines equivalence between error_conditions in the current category with error_codes from any category. Since you are creating custom error conditions, it is the second overload that you must override.

Defining equivalence is simple: return true if you want an error_code to be equivalent to your condition, otherwise return false.

If your intent is to abstract OS-specific errors, you might implement error_category::equivalent() like this:

bool api_category_impl::equivalent(
const std::error_code& code,
int condition) const
{
switch (condition)
{
...
case api_error::name_not_found:
#if defined(_WIN32)
return code == std::error_code(
WSAEAI_NONAME, system_category());
#else
return code = std::error_code(
EAI_NONAME, getaddrinfo_category());
#endif
...
default:
return false;
}
}

(Obviously getaddrinfo_category() needs to be defined somewhere too.)

The tests can be as complex as you like, and can even reuse other error_condition constants. You may want to do this if you're creating a context-specific error condition, or testing for a set of related errors:

bool api_category_impl::equivalent(
const std::error_code& code,
int condition) const
{
switch (condition)
{
case api_error::low_system_resources:
return code == std::errc::not_enough_memory
|| code == std::errc::resource_unavailable_try_again
|| code == std::errc::too_many_files_open
|| code == std::errc::too_many_files_open_in_system;
...
case api_error::no_such_entry:
return code == std::errc::no_such_file_or_directory;
default:
return false;
}
}

Step 6: uniquely identify the category

You should provide a function to return a reference to a category object:

const std::error_category& api_category();

such that it always returns a reference to the same object. As with custom error codes, you can use a global:

api_category_impl api_category_instance;

const std::error_category& api_category()
{
return api_category_instance;
}

or you can make use of C++0x's thread-safe static variables:

const std::error_category& api_category()
{
static api_category_impl instance;
return instance;
}

Step 7: construct an error_condition from the enum

The <system_error> implementation requires a function called make_error_condition() to associate an error value with a category:

std::error_condition make_error_condition(api_error e)
{
return std::error_condition(
static_cast<int>(e),
api_category());
}

For completeness, you should also provide the equivalent function for construction of an error_code. I'll leave that as an exercise for the reader.

Step 8: register for implicit conversion to error_condition

Finally, for the api_error enumerators to be usable as error_condition constants, enable the conversion constructor using the is_error_condition_enum type trait:

namespace std
{
template <>
struct is_error_condition_enum<api_error>
: public true_type {};
}

Using the error conditions

The api_error enumerators can now be used as error_condition constants, just as you may use those defined in std::errc:

std::error_code ec;
load_resource("http://some/url", ec);
if (ec == api_error::low_system_resources)
...

As I've said several times before, the original error code is retained and no information is lost. It doesn't matter whether that error code came from the operating system or from an HTTP library with its own error category. Your custom error conditions can work equally well with either.

Next, in what will probably be the final instalment, I'll discuss how to design APIs that use the <system_error> facility.

315 comments:

1 – 200 of 315   Newer›   Newest»
Anonymous said...

Hi Chris, thanks for this serie of articles!

This was really helpfull!

Great blog! Nice and impresive work!

Thanks, I've learned so many things about asynchronous thinking and programming!

What about URDL :)? This seems to be a great an usefull application of ASIO. And what about your book? ;)

Once again : thanks for your work! Very helpfull.

towi said...

Your blog series is amazing! Please, continue :-)

Unknown said...

Hi Chris, great series, I was looking forward to the API entry. This is a great intro.

Unknown said...

Hi Chris. Playing with clang I came across an error ? It seems related to something that crept into the standard late. This affects the steps involving 'defining and declaring' non user defined types in std::.

The behavior of a C++ program is undefined if it adds declarations or definitions to namespace std or to a namespace within namespace std unless otherwise specified. A program may add a template specialization for any standard library template to namespace std only if the declaration depends on a user-defined type and the specialization meets the standard library requirements for the original template and is not explicitly prohibited.

Unknown said...

I just came across this, this also causes asio to fail as it uses signals2 and there is a problem with forward declarations. This is fixed in boost svn though.

http://stackoverflow.com/questions/9576112/implicit-instantiation-of-undefined-template-boost-bug-or-clang-bug

Logan Chien said...

It seems that there is a minor typo in the getaddrinfo_category example: the assignment operator should be replaced by equality comparison operator.

BEFORE:

return code = std::error_code(
EAI_NONAME, getaddrinfo_category());

AFTER:

return code == std::error_code(
EAI_NONAME, getaddrinfo_category());

Unknown said...

Learn Easy C Programming Tutorials.

Unknown said...

Hi Chris, please finish the series! We are still waiting.

Anonymous said...

Do you have the complete working code for this?

Rui Pacheco said...

How would std::error_code handle an error that includes not just an error code but also a message from the remote system?

Jack Norman said...

Thanks for the great article! If you are in search of a great software development company, check Softvelopers. Company has 17+ years of field experience in software development.

Chris Winslow said...

That is a really good article. I would like to add that sometimes if you want to get a proper product done it is better to contact a software development company with high proficiency in this. I would recommend the EffectiveSoftcompany.

Mariya said...

Thanks for sharing such information! It may come to your mind that it's better to turn a software development company...then
iTechArt will help you I guess. At least their expertise is a match.

DBJDBJ said...

Does anybody mind, if I ask? Where is the next post, on "how to design API's" to use this?

Ada Smith said...

Wow cool who does not know this site safe online casino ratings that half of life does not know on this site you can really earn money without blessing

Sergey said...

Hire php developers – Save cost by hiring dedicated PHP developers & PHP programmer from this site.

Siva said...

The blog you have shared is incredibly helpful. The tips you have shared related to web development is really informative. Thanks for sharing this blog!
Hire Dedicated Opencart Developers
Hire Dedicated Magento Developer
Hire Dedicated Web Developers
Hire Dedicated Developers
Hire Cake Php Developer

Sekar said...

In the competitive market finding the best outsourcing services is a challenging task. This post helps me to find the best one. Thanks for sharing this post.
Hire a Programmer
Mobile App Development India
Hire Wordpress Developer
Hire Opencart Developer
Hire Php Programmer

bestjobsinbhubaneswar said...

Superb post by the author.
Web Design

Tyler Worgan said...

I have read your article, it is very informative and helpful for me.I admire the valuable information you offer in your articles. Thanks for posting it..

tree trimmers palm beach county

Tyler Worgan said...

Thanks for sharing a very nice article
stamped concrete minneapolis

Tyler Worgan said...

I think this is one of the most significant information for me. And i’m glad reading your article. But should remark on some general things, The web site style is perfect, the articles is really great : D. Good job, cheers
fire restoration services broward county

Tyler Worgan said...

Hi, This is nice article you shared great information i have read it thanks for giving such a wonderful Blog for reader.
water heater installation minneapolis

Gerald Force said...

Excellent Post! Los angeles employment lawyer

Tyler Worgan said...

This is a great article thanks for sharing this informative information. I will visit your blog regularly for some latest posts
fire restoration companies fort lauderdale

Tyler Worgan said...

I think this is one of the most significant information for me. And i’m glad reading your article. But should remark on some general things, The web site style is perfect, the articles is really great : D. Good job, cheers.
remodeling contractors clearfield ut

Tyler Worgan said...

Thanks for a wonderful share. Your article has proved your hard work and experience you have got in this field. Brilliant .i love it reading.
stamped concrete driveway fort lauderdale

haroonullah said...

Hello, I have browsed most of your posts. This post is probably where I got the most useful information for my research. Thanks for posting, maybe we can see more on this. Are you aware of any other websites on this subject.
Haroon Ullah

Trade Stock said...

Thanks for sharing the great article on this topic.
Jonathan Dax Cooke

Tyler Worgan said...

Superbly written article, if only all bloggers offered the same content as you, the internet would be a far better place.
bathroom remodeling ogden ut

Tyler Worgan said...

Great article and a nice way to promote online. I’m satisfied with the information that you provided
concrete stamping company broward county

Alvin Steve said...

I like this post.
emergency tree services tequesta

Clark said...

Brilliant .i love it reading.
patio screen repair port st lucie

Clark said...

Nice post.
tile reglazing west palm beach

Clark said...

Nice post.
tile reglazing west palm beach

Clark said...

Wonderful post shared.
bathtub refinishing and fiberglass expert fort lauderdale

Alvin Steve said...

Amazing post shared. fiberglass bathtub refinishing west palm beach

Alvin Steve said...

I really inspired from this post.

ac repair west palm beach fl

maya said...

interesting way of explanation .
hotels in Karachi

maya said...

Thanks! keep rocking.
123movies

The Gabay Group said...

הייתי חייבת לפרגן, תודה על השיתוף.
חברת קבוצת גבאי

Unknown said...

Nice post.

גדרות אלומיניום

Cinema furniture said...
This comment has been removed by the author.
Unknown said...

Thanks for a wonderful share.
123movies

Petersons said...

Thanks for the great article!
123movies

Aleena said...

סופסוף מישהו שתואם לדעותיי בנושא. תודה.
תכשיטי אפולו

Dafmatok Hosting Trays said...

מזל שנתקלתי בכתבה הזאת. בדיוק בזמן
מגשי אירוח

Cinema furniture said...

הייתי חייבת לפרגן, תודה על השיתוף.
שולחן עגול נפתח

Comfi furniture said...

כתיבה מעולה, אהבתי. אשתף עם העוקבים שלי.
רהיטים לסלון

Amediciercosmetic said...

תמשיכו בפרסום פוסטים מעניינים כמו זה. תודה.
טיפול קוסמטי לפנים

Unknown said...

great post.

סראונד סאונד

Planner Productions said...

כל מילה. תודה על השיתוף, מחכה לעוד פוסטים בנושא.
אטרקציות לחתונות

Helena Merry said...

go123movies
Best free streaming movies sites: Movies are the great entertainment part of our life. Not just for entertainment purposes also it influences our living greatly. Yes, there are millions of good movies to watch in our free time with family and friends. Besides watching movies on TV and at the theaters, watch free streaming movies online from free movie sites have become popular.

brokertome said...

מעולה. תודה על הכתיבה היצירתית.
ברוקרים

Unknown said...

thanks for sharing.
123 movie

Unknown said...

Great work keep it up.

123movies

gemcreature said...

Great Information,it has lot for stuff which is informative.I will share the post with my friend
playboy bunny necklace

Unknown said...

keep posting very nice.

סייטלינקס

delight girls said...

The best way to spend your night in 31 Dec with Hong Kong Escorts Girls, call us for bookings

Bloxi said...

אין ספק שהפוסט הזה דורש שיתוף. תודה.
הדפסה על עץ

lajwantidevi said...

vidmate

Reputation management said...

כל מילה. תודה על השיתוף, מחכה לעוד פוסטים בנושא.
ניהול מוניטין ברשת

sdf said...

Lottery Sambad Today Result 11:55 AM, 4PM,8PM
Lottery Sambad Today Result

Anonymous said...

Thanks for sharing this nice informatione!
financial modelling to give you confidence in your financial strategy and provide business valuations.

delight girls said...

Want sexy and hot moments in popular Hong Kong Escort, Give your life lovely time, Want more fun with escort girls.

Anonymous said...

Download your favorite Latest Mp3 Lyrics which are available in English, Hindi, Bangla, Telugu, Latin, Arabic, Russian, etc.

Click Here

Click Here

Click Here

Click Here

Click Here

wewin55 said...

Wow! Very informative blog. I visits lots of blog but this blog is very unique. Thanks
CMD368

Plaisio said...

Thanks for the information. This is a very informative post. Plaisio Computer SA provide a stock quote, history, news and other vital information to help you with your stock trading. It is a Greece-based company that assembles and trades personal computers telecommunication.

Daily Image Funda said...

Wonderful share by the author. I found this blog helps me a lot.
Good Night Romantic images

Unknown said...

Superbly written article
global asset management korea

Anonymous said...

Thanks for your sharing! The information your share is very useful to me and many people are looking for them just like me!


We have collection of best 2020 sex doll to fulfill your desire, so if you need realistic female sex dolls then Love Doll Palace is largest online store for you , who are providing young love doll for you, these are made by silicone and TPE, which will give you full happiness at sex duration and you can enjoy with her at any position.

Anonymous said...

Choose the right lawyer to defend you. The New York Criminal Defense Attorneys at Abe George Lawyer Law Group handle different types of crimes in NewYork. So if you need then abe george lawyer is one of the best for you!!

Abe George and Lawyer

Abe George and Lawyer

Abe George and Lawyer
Abe George Lawyer
Abe George Lawyer
Abe George and Lawyer
Abe George and Lawyer

Sitelinx said...

כל מילה. תודה על השיתוף, מחכה לעוד פוסטים בנושא.
חברת קידום אתרים

Anonymous said...


Meet Abe George Lawyer recognized as the best criminal defense attorney to protect your rights and handles entire crucial situations of yours and your family.
He is a highly experienced executor, who serves the excellent defendant assistances with his potential methodology to come you out from the crime obligations
efficiently.
abe george lawyer
abe george lawyer
abe george lawyer

Unknown said...

כתיבה מעולה, אהבתי. אשתף עם העוקבים שלי.
מזרון למיטת תינוק

Unknown said...

כל מילה. תודה על השיתוף, מחכה לעוד פוסטים בנושא.
גיוס כסף לסטארט אפ

Anonymous said...


Thanks For Sharing this Information!!
If you are getting issue login to orbi Router. Then use www.orbilogin.net. It enables the user to connect to orbi device with
ease.

Dogma said...

פוסט נחמד. חייב לשתף עם העוקבים שלי.
עיצוב ממשק משתמש

Ignou projects said...

Thanks for sharing

Ignou MA education project

dev said...


Hi! I really like your content. Your post is really informative. I have learned a lot from your article and I’m looking forward to apply it.
ignou assignment 2019 ba
ignou ba assignment
ignou assignment 2020
ignou assignment december 2019





Hie I really like your content. Your post is really informative & geneunie.Thank for sharing such a good information really it.
ignou solved assignment
ignou assignment 2019
ignou solved assignment 2019
Ignou mba finance project








Hi! I really like your content. Your post is really informative. I have learned a lot from your article and I’m looking forward to apply it.
ignou solved assignment 2020
bhdf 101
ignou assignment solved 2019





This is very interesting, You’re a very skilled blogger. I’ve joined your rss feed and look forward to seeking more of your magnificent post. Also, I’ve shared your website in my social networks.
ignou assignment solved 2019
ignou mcom assignment
ignou assignment 2019 solved













This is very interesting, You’re a very skilled blogger. I’ve joined your rss feed and look forward to seeking more of your magnificent post. Also, I’ve shared your website in my social networks.
ignou assignment 2019 ba
ignou ba assignment
ignou solved assignment free





dev said...

Fantastic piece, well tailored…. You sort of cleared my phobias… Now I can give it a shot… I pray I don’t run out of contents!…a big kudos

gyn services brooklyn
smp seattle
bathroom remodel near me
hvac near me
vinyl siding repair near me
wedding dj columbia sc

How To Asset Manage said...

great post.
global asset management

Global Asset Management Udemy said...

Wow cool
global asset management korea

Priya said...

What a Beautiful post! This is so chock full of useful information I can't wait to dig and start using my time on blogging. I am just over six month into blogging , I newly wrote an article Best Immune Booster Fitspire product makes immune stronger & healthier to fight against corona.

dev said...

Fantastic piece, well tailored…. You sort of cleared my phobias… Now I can give it a shot… I pray I don’t run out of contents!…a big kudos

gyn services brooklyn
smp seattle
bathroom remodel near me
hvac near me
vinyl siding repairin summerville sc
wedding dj columbia sc

routerlogin.net said...

Get the support for www.routerlogin.net routers, extenders, modems, and cameras and other popular devices manufactured by the Netgear.

Coding P said...

Never experienced this error before, I will get solution form Los Angeles Wordpress Developer

udita sharma said...

Loveed it your cash app refund every single post

sheikh said...

Hire any of these c++ development companies I am sure they be able to sort this c++ error for you. All the companies listed have top c++ developers.

사설토토 said...

סגנון כתיבה מרענן, תודה על השיתוף.
הדפסה על קנבס

Clark said...

great.
מצלמות במעגל סגור

luckky said...

your artical is very great i regularly visit your website you can also visist my website my website url is https://letestnews.co.in/


letestnews

intercom4u said...

This is a great article thanks for sharing this informative information.
אינטרקום לדלת כניסה

Unboxthedigital said...

Great sitee and great experience you have this article is damn cool Column pipe manufacturer really and i bookmarked your page also......

Clark said...

nice post.
global asset management

Fixadoor said...

Great Information
Garage door repair

Clark said...

nice post.
Global asset management Korea

Stratford Management said...

thanks for share the valuable knowledge
stratford management Tokyo

Petersons said...

what a great style, it not easy job well don.


Bastion Balance Seoul

Petersons said...

Congratulations you guys, nice couple, have fun.


Investors Magazine

ibglobalacademy said...

I have a project that I'm simply now working on, and I have been at the
glance out for such information
IB Global Academy

orbilgoin said...

For technical support https://orbilogiinn.com/ login Visit our site and get the 24*7 technical support from us.
Helpline no. 9177320091

Garage Door Pros Ontario said...

Thanks for sharing the useful information.
Garage Door Repair Orleans

dextertex said...

I found your blog very informative and really well written. otsakre for your good effort you've put in. Visit me for Router tech support. 24/7 Chat Assistance for complex Routers issues. Call me for Assistance 9177320091 Visit me for making good relations. Thanks.
http://orbiloginn.com
https://www.linksysmarrtwifi.com
https://myarloo.com/ http://www.routersynologyy.com https://routerloglogin.com

Orbi Login
Arlo Login
Linksyssmartwifi com
find Synology
Routerlogin

Petersons said...

מרתק כמה שלא הבנתי כלום עד שקראתי את המאמר הנפלא הזה

בניית בריכת שחייה מבטון

James said...

I really like your blog. Great article.
overhead door repair Calgary

Selectmytutor said...

This unique blog is no doubt cool additionally informative. I have discovered a lot of interesting advices out of this amazing blog. I ad love to return over and over again. Thanks a bunch!
Primary School Tutor

Petersons said...

Great lovely arrangements looks traditional wedding.


Garage Door Repair Calgary

Garage Door Pros Ontario said...

Nice ideas shared.

Garage Door Repair Cranberry

networkengineer said...

I am a Staff Author at FieldEngineer.com a Marketplace for On-Demand telecom workforce, extending from field engineers to high-level network engineers, project managers and Network Architects in 146 nation

Soa security

euro cars said...

מעניין מאוד, למרות שלא הכל מדויק לדעתי
רכב במימון מלא ללא מקדמה

euro cars said...

תודה על השיתוף, מאוד מעניין
עקירה כירורגית

euro cars said...

חשבתי שאתקל בסתם עוד מאמר שטחי. טעיתי.
שמות כלבים

James said...

very nice article
broken extension spring repair ottawa

James said...

Keep up the good work
garage door repair brock

James said...

Really informative post
garage door repair sherwood park

Petersons said...

Lovely pictures, awesome these are looking so romantic and locations are great.


garage door opener repair pittsburgh

James said...

Thanks a lot for sharing a piece of wonderful information
Guys Fix It Mag

Petersons said...

Thank you for the helpful post. I found your blog with Google and I will start following. Hope to see new blogs soon.


dishwasher repair mississauga

James said...

Thanks for sharing this unique and informative content.
garage door repair chestermere

Petersons said...

Ideas! i think no need of any ideas just get to gather and start having fun, chit chat and other activities.


garage door repair vancouver

tredmill said...

Fantastic piece, well tailored…. You sort of cleared my phobias… Now I can give it a shot… I pray I don’t run out of contents!…a big kudos

gym equipments online
gym equipment online

Micky said...

Thanks for posting.
ยูฟ่าเบท

Micky said...

Great article you shared with us.
แทงบอลออนไลน์

Petersons said...

Nice idea, i am gonna try the same for my web site. thanks.


Garage Door Repair Doctors

Micky said...

it is very informative and helpful for me.
เรื่องแปลกญี่ปุ่น

Petersons said...

Nice service there are just few who are providing this service great job.


Los Angeles Garage Door Repair

Petersons said...

what a great style, it not easy job well don.


garage door moving slow

Petersons said...

אני לא מסכים עם כל מה שכתוב, אבל מאמר מעניין מאוד


אשראי מסחרי

Petersons said...

לא כל כך מסכים עם הכל כאן האמת.

התקנת אינטרקום

Eva Wilson said...

Wow!, thanks for sharing your ideas and especially for giving us priced features information. I love the way you balanced your views by still advocating. Well, for those of us that are still growing and does not have money to lose, your blog is really informative and helpful.

Regards,
Online Dissertation Help

Petersons said...

Great article nice pictures and different concept for me i didn't know about this way of making wish.


silvergaragedoors.ca

Petersons said...

This is great article and so helpful.


garage door repair west edmonton

healer said...

I simply wanted to write down a fast word to mention you for those wonderful tips and hints you’re showing on this site dg casino



Hamza said...

Sounds like you have done something remarkable in your field of excellence!
live22

Petersons said...

This is a great blog . Very helpful.


garage door repair

Hamza said...

Thanks for suggesting me this amazing site and something valuable!
ยืนยัน บัตรประชาชน รับเครดิตฟรี2020

Petersons said...

Cool blog you got here and thank you for the valuable info.


Garage Door Installation Calgary

maurya said...

Good explanation. I would like to thank you for the good efforts.
value of devops
java mobile application
adwords optimization
is web development dying
seo interview questions

Hamza said...

One of the best sites i have visited in last few weeks and i would love to be the part of your emerging community!
먹튀검증업체

Petersons said...

It’s really great post, nice blog..I would like to appreciate your work and would like to tell to my friends.


garage door cable repair

Petersons said...

Resources like the one you mentioned here will be very useful to me! I will post a link to this page on my blog.Resources like the one you mentioned here will be very useful to me! I will post a link to this page on my blog.


garage door repair

sweet dreams cattery said...

I will be honest these is the most useful tips I have read till date. Thanks for putting all this together. As a newbie blogger, I am going through different stages of learning and all ups and downs what a normal newbie blogger face. But the most important thing I am not giving up and holding it until I find success. I am really positive using your thoughts and knowledge will help me to improve myself. Siberian husky Puppies Breeders      Great work. Keep doing this great work for us. Loved it.

Petersons said...

You have got some great posts in your blog. Keep up with the good work.


garage door repair Cambridge

Unknown said...

I really loved reading your thoughts, obviously you know what are you talking about! Your site is so easy to use too, I’ve bookmark it in my folder


garage door repair North York 

Petersons said...

אני לא מסכים עם כל מה שכתוב, אבל מאמר מעניין מאוד

חברת ניקיון בצפון

Micky john said...

Really appreciate this wonderful post
Finance news

David Smith said...

I really love your weblog, Its great to find not absolutely everyone is just posting a ton of rubbish these days!

בר מתוקים

Jack Harry said...

Nice service there are just few who are providing this service great job.
Finance Magazine

Jack Harry said...

Nice service there are just few who are providing this service great job.
duct cleaning pittsburgh

Unknown said...

This discussion unexpectedly takes my attention to join inside. Well, after I read all of them, it gives me new idea for my blog. thanks



duct cleaning pittsburgh 




David Smith said...

I have been reading your posts regularly. I need to say that you are doing a fantastic job. Please keep up the great work.

Garage Door Doctor

Nio Stars Technologies LLP said...

Amazing article...Thanks for sharing....
Nio Stars Technologies LLP is a best Digital Marketing Company in Pune. We offering all Digital Marketing Services like SEO, SEM, SMO, SEM, Online Advertising,Email Marketing. We provide 24/7 Services for you.

Jack Harry said...

This amazing post impressed me
garage door repair in pittsburgh

Micky john said...

This amazing post impressed me
garage door repair burlington

Micky john said...

wonderful informative post
cleveland plumbing services

Micky john said...

This is a great post.
essay writing service reddit

Micky john said...

Thanks for the nice blog. It was very useful for me. I'm happy I found this blog.
emergency garage door repair akron

Prerna Mehta said...

Useful post Thanks for sharing it that’s truly valuable knowledge about similar topic. Amazing. Have a more successful day. Amazing write-up always finds something interesting.

sdkdskl said...

https://lsysy246.wixsite.com/thekingcasino/-메리트카지노
https://lsysy246.wixsite.com/igaming/-메리트카지노
https://lsysy246.wixsite.com/casino33/-메리트카지노

Micky john said...

מרתק כמה שלא הבנתי כלום עד שקראתי את המאמר הנפלא הזה
פיתוח אפליקציות Gapps

Antitesto said...

Attractive, post. I just stumbled upon Your weblog and wanted to say that I have liked browsing your blog posts. After all, I will surely subscribe to your feed,
and I hope you will write again soon!
I felt very happy while reading this site. This was really very informative site for me. I really liked it. This was really a cordial post.
Thanks a lot!.
jav

בלוג מידע said...

מאמר ממש מרשים תודה רבה על כל המידע המקצועי
שתלים דנטליים

KaleemSeo said...

We are really grateful for your blog post. You will find a lot of approaches after visiting your post. I was exactly searching for. Thanks for such post and please keep it up. Great work. polyurea

Unknown said...

Great thank you article for all the comprehensive information

בבורגס

Micky john said...

I like this post, And I figure that they have a great time to peruse this post, they might take a decent site to make an information, thanks for sharing it with me.
garage door repair burlington

מגזין מאמרים said...

thanks for articles is the best iread
מנעולן 24 שעות

שיווק באינטרנט said...


I wanted to point out that a really professional article thank you so much for all the content
חשיבות של עיצוב אתר מנעולן

메이저사이트 said...

I was browsing the internet for information and found your blog. I am impressed with the information you 토토사이트

메이저사이트 said...

For no reason knew that opinions could be this varied. Thanks for all the enthusiasm to offer 먹튀검증

Saayed Khan said...

Thank you for sharing your issue. Here are Few Hostinger Coupon Code.

Unknown said...

Hi! I really like your content Your post is really informative. I have learned a lot from your article and I’m looking forward to apply it with my children and in my class too.
main mumbai result
matka tips

online reputation said...

This is a wonderful article, Given so much info in it, These type of articles keeps the user's interest in the website.
garage door replacement north dallas

NetDroid Technology said...

Enjoyed reading the article above, really explains everything in detail, the article is very interesting and effective. Thank you and good luck with the upcoming articles...For more please visit: Mobile App Development India

좋은사이토토 said...

Hello
Thank you for giving me useful information.
Please keep posting good information in the future
I will visit you often. Thank you.
I am also running the site. 메이저놀이터 This is a related site, so please visit once.
Have a niceday!

Jimmy said...

Your post has those facts which are not accessible from anywhere else.
window repair markham

메이저사이트 said...

We promise to do our This is a pure nice post.Plz answer back as I’m looking to construct 꽁머니

메이저사이트 said...

my own blog and would like to find out where u got this from Your post has really helped me a lot. 안전사이트

aishu said...

Thanks for spending all your pleasant time to make such a Creative content for us. AWS Training in Chennai

Micky said...

I like this post, And I figure that they have a great time to peruse this post, they might take a decent site to make an information, thanks for sharing it with me.
garage door cable repair philadelphia

Herry said...

It's always exciting to read articles from other writers and practice something from their websites.
window replacement

먹튀검증 said...

must say this blog loads a lot faster then 먹튀검증.Can you suggest a good web hosting provider at a reasonableprice? Thank you, I appreciate it!

Petersons said...

Spot on with this article, I really think this website needs more attention. I'll probably be back to read more, thanks for the info.


Stamford Garage Doors

Jerry said...

I like this post, And I figure that they have a great time to peruse this post, they might take a decent site to make an information, thanks for sharing it with me.
austin affordable garage spring replacement

Petersons said...

Spot on with this article, I really think this website needs more attention. I'll probably be back to read more, thanks for the info.


24-hour garage door repair in Las Vegas

CloudsDeal said...

Headout discount, Headout Singapore, NYC, Paris, oyo rooms near delhi railway station, best top hotels in maldives, web hosting affiliate programs Headout deals, travel tips + "write for us",York, cheap hotels in new york city top 10 seo companies in mumbai, gatlinburg indoor pool, hotels in gatlinburg with indoor pool, free, profile creation sites 2021 , top 500 maldives hotels for honeymoon , web hosting oyo hotels in Goa near baga beach, Hotels web hosting cheap Hotels Near Niagara Falls, Hotels

CloudsDeal said...

Web Hosting Affiliate Programs, web hosting affiliate programs in india, affiliate programs for web hosting, affiliate programs hosting hostinger coupon code india, Hotels , web hosting, bluehost affiliate program, affiliate program web hosting, affiliate program web

Unknown said...

코로나 락다운 대한항공 조현아 빅뱅승리 메이저놀이터 목록 아이유 바퀴달린집 키노사다리하는법 추천토토 실시간배팅 MGM승률 토토사이트목록
I recommend a Toto site that has been verified for safe use. 토토사이트 If you ask VIP Toto, I promise to recommend a safety playground. 안전토토사이트We promise to recommend the Toto site that is safer than anyone else, 토토 and please contact VIP Toto for a major safety playground that you can trust and use. 스포츠토토

Petersons said...

Resources like the one you mentioned here will be very useful to me! I will post a link to this page on my blog.Resources like the one you mentioned here will be very useful to me! I will post a link to this page on my blog.


San Francisco Garage Door Repair

Alvin Steve said...

So lucky to come across your excellent blog. Your blog brings me a great deal of fun. Good luck with the site.
commercial real estate website design

Petersons said...

I am really very agree with your qualities it is very helpful for look like home. Thanks so much for info and keep it up.


window replacement

Alvin Steve said...

A useful post shared.
1 1 marketing

Petersons said...

I am really very agree with your qualities it is very helpful for look like home. Thanks so much for info and keep it up.


garage door motor repair

Petersons said...

I am really very agree with your qualities it is very helpful for look like home. Thanks so much for info and keep it up.


central air conditioning

ádccdvfvsd said...

I've been searching for hours on this topic and finally found your post. 먹튀검증사이트, I have read your post and I am very impressed. We prefer your opinion and will visit this site frequently to refer to your opinion. When would you like to visit my site?

Petersons said...

I am really very agree with your qualities it is very helpful for look like home. Thanks so much for info and keep it up.


Kitchen Star Houston

Petersons said...

I am really very agree with your qualities it is very helpful for look like home. Thanks so much for info and keep it up.


garage door cable repair

Alvin Steve said...

A very awesome blog post. We are really grateful for your blog post. You will find a lot of approaches after visiting your post.
dentist solvang

Alvin Steve said...

This is a wonderful article, Given so much info in it, These type of articles keeps the user's interest in the website.
------------
[url=https://www.livingyourawesome.com/post/i-feel-like-a-failure]feeling like a failure[/url]

Herry said...

Excellent article. The writing style which you have used in this article is very good and it made the article of better quality.
cash value life insurance

«Oldest ‹Older   1 – 200 of 315   Newer› Newest»