fix: Define specific exceptions and fix tests
diff --git a/erpnext/accounts/doctype/accounting_dimension_filter/test_accounting_dimension_filter.py b/erpnext/accounts/doctype/accounting_dimension_filter/test_accounting_dimension_filter.py
index 801786b..f67e1de 100644
--- a/erpnext/accounts/doctype/accounting_dimension_filter/test_accounting_dimension_filter.py
+++ b/erpnext/accounts/doctype/accounting_dimension_filter/test_accounting_dimension_filter.py
@@ -6,7 +6,8 @@
 import frappe
 import unittest
 from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice
-from erpnext.accounts.doctype.accounting_dimension.test_accounting_dimension import create_dimension
+from erpnext.accounts.doctype.accounting_dimension.test_accounting_dimension import create_dimension, disable_dimension
+from erpnext.exceptions import InvalidAccountDimension, MandatoryDimension
 
 class TestAccountingDimensionFilter(unittest.TestCase):
 	def setUp(self):
@@ -16,19 +17,25 @@
 	def test_allowed_dimension_validation(self):
 		si = create_sales_invoice(do_not_save=1)
 		si.items[0].cost_center = 'Main - _TC'
+		si.location = 'Block 1'
 		si.save()
 
-		self.assertRaises(frappe.ValidationError, si.submit)
+		self.assertRaises(InvalidAccountDimension, si.submit)
 
 	def test_mandatory_dimension_validation(self):
 		si = create_sales_invoice(do_not_save=1)
-		si.items[0].location = ''
+		si.location = 'Block 1'
+
+		# Test with no department for Sales Account
+		si.items[0].department = ''
+		si.items[0].cost_center = '_Test Cost Center 2 - _TC'
 		si.save()
 
-		self.assertRaises(frappe.ValidationError, si.submit)
+		self.assertRaises(MandatoryDimension, si.submit)
 
 	def tearDown(self):
 		disable_dimension_filter()
+		disable_dimension()
 
 def create_accounting_dimension_filter():
 	if not frappe.db.get_value('Accounting Dimension Filter',
@@ -52,10 +59,10 @@
 		doc.save()
 
 	if not frappe.db.get_value('Accounting Dimension Filter',
-		{'accounting_dimension': 'Location'}):
+		{'accounting_dimension': 'Department'}):
 		frappe.get_doc({
 			'doctype': 'Accounting Dimension Filter',
-			'accounting_dimension': 'Location',
+			'accounting_dimension': 'Department',
 			'allow_or_restrict': 'Allow',
 			'company': '_Test Company',
 			'accounts': [{
@@ -63,12 +70,12 @@
 				'is_mandatory': 1
 			}],
 			'dimensions': [{
-				'accounting_dimension': 'Location',
-				'dimension_value': 'Block 1'
+				'accounting_dimension': 'Department',
+				'dimension_value': '_Test Department - _TC'
 			}]
 		}).insert()
 	else:
-		doc = frappe.get_doc('Accounting Dimension Filter', {'accounting_dimension': 'Location'})
+		doc = frappe.get_doc('Accounting Dimension Filter', {'accounting_dimension': 'Department'})
 		doc.disabled = 0
 		doc.save()
 
@@ -77,6 +84,6 @@
 	doc.disabled = 1
 	doc.save()
 
-	doc = frappe.get_doc('Accounting Dimension Filter', {'accounting_dimension': 'Location'})
+	doc = frappe.get_doc('Accounting Dimension Filter', {'accounting_dimension': 'Department'})
 	doc.disabled = 1
 	doc.save()
diff --git a/erpnext/accounts/doctype/gl_entry/gl_entry.py b/erpnext/accounts/doctype/gl_entry/gl_entry.py
index b3caf6a..f586de8 100644
--- a/erpnext/accounts/doctype/gl_entry/gl_entry.py
+++ b/erpnext/accounts/doctype/gl_entry/gl_entry.py
@@ -11,7 +11,7 @@
 from erpnext.accounts.party import validate_party_gle_currency, validate_party_frozen_disabled
 from erpnext.accounts.utils import get_account_currency
 from erpnext.accounts.utils import get_fiscal_year
-from erpnext.exceptions import InvalidAccountCurrency
+from erpnext.exceptions import InvalidAccountCurrency, InvalidAccountDimension, MandatoryDimension
 from erpnext.accounts.doctype.accounting_dimension.accounting_dimension import get_checks_for_pl_and_bs_accounts
 from erpnext.accounts.doctype.accounting_dimension_filter.accounting_dimension_filter import get_dimension_filter_map
 from six import iteritems
@@ -101,16 +101,16 @@
 			if self.account == account:
 				if value['is_mandatory'] and not self.get(dimension):
 					frappe.throw(_("{0} is mandatory for account {1}").format(
-						frappe.bold(frappe.unscrub(dimension)), frappe.bold(self.account)))
+						frappe.bold(frappe.unscrub(dimension)), frappe.bold(self.account)), MandatoryDimension)
 
 				if value['allow_or_restrict'] == 'Allow':
 					if self.get(dimension) and self.get(dimension) not in value['allowed_dimensions']:
 						frappe.throw(_("Invalid value {0} for account {1}").format(
-							frappe.bold(self.get(dimension)), frappe.bold(self.account)))
+							frappe.bold(self.get(dimension)), frappe.bold(self.account)), InvalidAccountDimension)
 				else:
 					if self.get(dimension) and self.get(dimension) in value['allowed_dimensions']:
 						frappe.throw(_("Invalid value {0} for account {1}").format(
-							frappe.bold(self.get(dimension)), frappe.bold(self.account)))
+							frappe.bold(self.get(dimension)), frappe.bold(self.account)), InvalidAccountDimension)
 
 	def check_pl_account(self):
 		if self.is_opening=='Yes' and \
diff --git a/erpnext/exceptions.py b/erpnext/exceptions.py
index d92af5d..dcf3d6b 100644
--- a/erpnext/exceptions.py
+++ b/erpnext/exceptions.py
@@ -6,3 +6,5 @@
 class InvalidAccountCurrency(frappe.ValidationError): pass
 class InvalidCurrency(frappe.ValidationError): pass
 class PartyDisabled(frappe.ValidationError):pass
+class InvalidAccountDimension(frappe.ValidationError): pass
+class MandatoryDimension(frappe.ValidationError): pass