مثال بعدی در ظاهر بسیار ساده است. برنامهئی بنویسید که دو عدد را از ورودی بگیرد و چهار عمل اصلی را با آن دو عدد انجام دهد. برای نمونه اگر بترتیی 4و 5 را وارد کنید باید خروجی مشابه زیر داشته باشیم:
4 + 5 = 9
4 – 5 = -1
4 * 5 = 20
4 / 5 = 0
البته تقسیم در محاسبات صحیح فرض شده است. برای حل کردن این مثال مانند مثالهای گذشته براحتی میتوان با ورودی دریافت شده از کاربر کار کرد با این تفاوت که باید ابتدا مطمئن شویم که ورودی عدد است و نه چیز دیگر. ضمنا برای این مثال ورودی عدد منفی را نیز از کاربر نخواهیم پذیرفت. کد این برنامه بصورت زیر است:
-module(ex5). -export([main/0]). main() -> try calc() catch error:_Error -> io:format("Please Enter only Numeric type~n"); throw:negativeNumber -> ("Please Enter only positive number~n") end. calc() -> {A,B} = readInteger(), if A < 0 orelse B < 0 -> throw(negativeNumber); true -> ok end, [print(A,B,Op) || Op <- ["+","-","*","/"]]. readInteger() -> {ok,[First]} = io:fread("Enter the first number: ","~d"), {ok,[Second]} = io:fread("Enter the second number: ","~d"), {First,Second}. print(A,B,Op) -> Res = case Op of "+" -> A + B; "*" -> A * B; "-" -> A - B; "/" -> A div B end, io:fwrite("~w ~s ~w = ~w ~n",[A, Op, B, Res]).
بطور مشخص در کد بالا سیاست ارلنگ در مواجهه با استثناءها قابل مشاهده است. سیاستی که اصطلاحا "اجازه بده خراب شود" نام دارد. به این معنی که جلوگیری از خطا و باگ ها تقریبا غیر ممکن است و بهتر است بجای آن تلاش برای کنترل شرایط پس از خطا صرف شود. در مقابل این سیاست، برنامه نویسی تدافعی defensive programming قرار دارد که سعی دارد هر خطا را در همان محل بررسی کند. برای این منظور عبارات کنترلی خطا (try/catch ) تنها در تابع آخر قرار خواهد گرفت و سایر توابع صرفا کاری برای کنترل و پیشگیری خطا انجام نخواهد داد. البته در بسیاری از زبانهای شئگرا هم مدل برنامه نویسی تدافعی کنار گذاشته شده است.
در کد بالا تابع main خطا ها را بررسی میکند و تنها تابع calc را صدا میزند. این تابع سپس تابع readInteger را صدا میزند که وظیفهاش خواندن دو مقدار عددی است. و در آخر هم تابع print صدا زده میشود.